javah可以被诱导生成具有一致行尾的.h文件吗?

javah可以被诱导生成具有一致行尾的.h文件吗?,java,java-native-interface,newline,javah,Java,Java Native Interface,Newline,Javah,我有一个maven项目,它通过执行javah生成.hjni文件,作为java库正常构建过程的一部分。然后将这些.h文件签入源代码管理(如git),并用于构建附带的本机库 一个小麻烦是由javah生成的文件因运行平台的不同而有不同的行尾。因此,如果Mac OSX开发人员运行构建并签入(UNIX样式的行尾),那么Windows开发人员随后将看到他们的构建已更改所有.h文件(为Windows样式的行尾)。但它们实际上并没有改变--javah只是以一种依赖于平台的方式运行 例如,在生成.h文件时,如何引

我有一个maven项目,它通过执行
javah
生成.hjni文件,作为java库正常构建过程的一部分。然后将这些.h文件签入源代码管理(如git),并用于构建附带的本机库

一个小麻烦是由
javah
生成的文件因运行平台的不同而有不同的行尾。因此,如果Mac OSX开发人员运行构建并签入(UNIX样式的行尾),那么Windows开发人员随后将看到他们的构建已更改所有.h文件(为Windows样式的行尾)。但它们实际上并没有改变--
javah
只是以一种依赖于平台的方式运行

例如,在生成.h文件时,如何引导
javah
始终使用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.exe
用法:
javah[选项]
其中[选项]包括:
-o输出文件(只能使用-d或-o中的一个)
-d输出目录
-v-详细启用详细输出
-h--帮助-?打印此邮件
-版本打印版本信息
-jni生成jni样式头文件(默认)
-强制始终写入输出文件
-类路径从中加载类的路径
-引导类路径从中加载引导类的路径
使用其完全限定名指定
(例如,java.lang.Object)。

也许可以手动启动与
javah
可执行文件启动相同的类,除了在执行此操作之前显式设置
“line.separator”
属性。但是,我找不到它将是什么类,或者在哪里。

'javah'在这方面与其他Java程序相同。行终止符由例如PrintWriter.println()写入,由系统属性“line.separator”确定。您可以尝试从命令行设置,但我怀疑您会从中获得任何乐趣。我会寻找一个更横向的解决方案,比如按照建议重新配置IDE,或者只在一台构建机器上运行javap。

'javah'在这方面与其他Java程序相同。行终止符由例如PrintWriter.println()写入,由系统属性“line.separator”确定。您可以尝试从命令行设置,但我怀疑您会从中获得任何乐趣。我会寻找一个更横向的解决方案,比如按照建议重新配置IDE,或者只在一台构建机器上运行javap。

我通过编写一个自定义启动器来解决这个问题,该启动器显式设置
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最终允许在另一个JVM中调用此启动器,例如在执行构建时在Maven的JVM实例中调用,而无需永久更改
line.separator
值。一个有趣的注意事项是
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>

com.sun
工具
1.7.0
系统
${java.home}/./lib/tools.jar

我通过编写一个自定义启动器来解决这个问题,该启动器显式设置了
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最终允许在另一个JVM中调用此启动器,例如在执行构建时在Maven的JVM实例中调用,而无需永久更改
line.separator
值。一个有趣的注意事项是
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>

com.sun
工具
1.7.0
系统
${java.home}/./lib/tools.jar

还是版本控制应该更好地处理这个问题?我宁愿不依赖版本控制系统来处理这里的行尾。我正在寻找一种适用于任何版本控制系统的解决方案,即修复
javah
行为的解决方案。我理解。如何处理其他类型的文件?它们也有类似的问题?其他文件也可以,因为大多数编辑器在编辑文件时都知道保留行尾。但是这些文件是自动生成的,
javah
不关心保留行尾。或者版本控制应该更好地处理这个问题?我宁愿不依赖版本控制系统来处理这里的行尾。我正在寻找一种适用于任何版本控制系统的解决方案,即修复
javah
行为的解决方案。我理解。如何处理其他类型的文件?它们也有类似的问题?其他文件也可以,因为大多数编辑器在编辑文件时都知道保留行尾。但是这些文件是自动生成的,
javah
不想保留行尾。我尝试在命令行上设置
line.separator
值。。。然后意识到这将是一个巧妙的伎俩。毕竟,在没有命令处理器解释的情况下,如何将“\n”放在命令行上?然后以跨平台兼容的方式进行?(小提示:您的答案指的是
javap
,但我指的是
javah
)我尝试在命令行上设置
行。分隔符
值。。。然后意识到这将是一个巧妙的伎俩。毕竟,在没有命令处理器解释的情况下,如何将“\n”放在命令行上?然后以跨平台兼容的方式进行?(小注:你的答案指的是
javap
,但我指的是