1

javahJava ライブラリの通常のビルド プロセスの一部として実行することにより、.h JNI ファイルを生成する Maven プロジェクトがあります。これらの .h ファイルはソース管理 (git など) にチェックインされ、付随するネイティブ ライブラリのビルドに使用されます。

マイナーな問題の 1 つは、javah実行されているプラ​​ットフォームによって生成されるファイルの行末が異なることです。そのため、Mac OSX 開発者がビルドを実行して (UNIX スタイルの行末で) チェックインすると、Windows 開発者はその後ビルドによってすべての .h ファイルが (Windows スタイルの行末に) 変更されたことがわかります。しかし、それらは実際には変更されていませんjavah。プラットフォームに依存した方法で動作しているだけです。

javahたとえば、.h ファイルを生成するときに UNIX スタイルの行末を常に使用するようにするにはどうすればよいですか? 適切なコマンド ライン スイッチがないようです。

> javah.exe
Usage:
  javah [options] <classes>
where [options] include:
  -o <file>                Output file (only one of -d or -o may be used)
  -d <dir>                 Output directory
  -v  -verbose             Enable verbose output
  -h  --help  -?           Print this message
  -version                 Print version information
  -jni                     Generate JNI-style header file (default)
  -force                   Always write output files
  -classpath <path>        Path from which to load classes
  -bootclasspath <path>    Path from which to load bootstrap classes
<classes> are specified with their fully qualified names
(for example, java.lang.Object).

おそらく、実行前にプロパティjavahを明示的に設定することを除いて、実行可能ファイルの起動と同じクラスを手動で起動することが可能です。"line.separator"しかし、それがどのクラスになるのか、どこにあるのかはわかりませんでした。

4

2 に答える 2

1

この点では、「javah」は他のすべての Java プログラムと同じです。行終端文字は、システム プロパティ「line.separator」によって決定されるように、PrintWriter.println() などによって書き込まれます。コマンドラインから設定することもできますが、その方法で喜びを得られるとは思えません。提案どおりに IDE を再構成するか、1 つのビルド マシンでのみ javap を実行するなど、より横方向のソリューションを探します。

于 2013-01-15T22:28:03.600 に答える
0

プロパティを明示的に設定するカスタムランチャーをline.separator作成し、ビルド中にそのランチャーを呼び出すことで、この問題を解決しました。

public class JavahLauncher {

    public static void main(String[] args) {
        String original = System.getProperty("line.separator");
        System.setProperty("line.separator", "\n");
        try {
            com.sun.tools.javah.Main.run(args, new PrintWriter(System.out));
        }
        finally {
            System.setProperty("line.separator", original);
        }
    }
}

try-finally を使用すると、値を永続的に変更することなく、ビルドの実行中に Maven の JVM インスタンスなどの別の JVM 内でこのランチャーを呼び出すことができline.separatorます。興味深い点の 1 つは、 が呼び出されるcom.sun.tools.javah.Main.mainため使用できないことですSystem.exit。Maven ビルドの一部として呼び出されると、Maven が終了します。

tools.jarこのランチャーをコンパイルするには、次のような依存関係が必要です。

<dependency>
    <groupId>com.sun</groupId>
    <artifactId>tools</artifactId>
    <version>1.7.0</version>
    <scope>system</scope>
    <systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>
于 2013-01-17T05:17:43.330 に答える