javah可以被诱导生成具有一致行尾的.h文件吗?
我有一个maven项目,它通过执行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文件时,如何引
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
,但我指的是