How to specify a system independent classpath
我需要运行带有自定义类路径的java命令。
在Windows上我需要输入:
在Linux上我需要输入:
我们目前有一个包含第一个版本的.bat文件和一个包含第二个版本的.sh文件。 这在大多数情况下工作正常,但在Windows上的git-bash失败,这需要带有分号分隔符的shell脚本。
是否有任何系统独立的方式来编写这样的类路径?
我会想到类似的东西
但这不是这种方式。
目前,我看到的唯一方法是让一些shell逻辑确定操作系统并从中生成正确的命令行。
java方式有更简单的方法吗?
-
如何在windows下运行shell脚本?
-
是的,bash也适用于Windows。 例如,如果你安装git,它包含一个非常好的shell:git-bash。
-
不是我知道的。 想到的最接近的事情是将类路径信息放在清单中并将其打包在jar中。
-
选项1:如果您不介意在运行之前创建jar,则可以在清单文件中指定类路径。那些路径是空间分隔的。 (请参阅向JAR文件的类路径添加类)
-
选项2使用例如uname添加用于检测OS的代码。然后执行SEP=\;或SEP=:并使用path${SEP}path。 (例如,参见如何检查是否在Cygwin,Mac或Linux中运行?)
-
选项3:Grep java帮助输出以查看java期望的分隔符:
1
| SEP=$(java -h |& grep"A [:;] separated" | grep -o"[:;]") |
-
选项4:如果安装了JDK,则可以打印File.pathSeparator:
1 2 3 4
| echo"interface C { static void main(String[] a) { System.out.print(java.io.File.pathSeparator); }}"> C.java
javac C.java
java C
rm C.{java,class} |
注意:只有路径分隔符(即; vs :)是特定于平台的。正斜杠(即some/class/path)在所有系统上都能正常工作以分离目录。
-
当前选项3(SEP=$(java -h |& grep"A [:;] separated" | grep -o"[:;]"))仅适用于英语区域设置。这是我的看法(在德语Windows 7和英语Ubuntu 14.04 LTS上成功测试):SEP=$( [ $(java -h |& grep";" | wc -l ) == 1 ] && echo";" || echo":" )
-
选项3必须是一个笑话。
-
@ 0xF,它有点hacky,但如果你想到它,运行系统上的java命令是??分隔符号java接受的单一事实来源。 java -h碰巧打印出正确的符号。添加了第四个选项,可能不那么hacky,但需要JDK。
根本不要指定它。使用'java -jar'命令,使用包含Main-Class属性的Manifest.MF命名JAR文件,并在必要时使用Class-Path属性,指定此依赖的任何其他JAR的相对位置。由于这是通过空格分隔的相对URL完成的,因此它与系统无关。
-
由于这是通过相对URL完成的,因此它与系统无关。 - 似乎表明您认为存在问题的路径。 Java在Windows和nix上都接受/的类路径。它是特定于平台的*路径分隔符。
-
Class-Path属性是否允许使用像lib/*这样的通配符? (快速测试不起作用。)类路径中的路径是相对于当前工作目录的,对吧?
-
不,清单文件中不支持类路径通配符。请参阅docs.oracle.com/javase/6/docs/technotes/tools/windows/… :但是,Class-Path jar-manifest标头中不支持类路径通配符。虽然在类路径上提供了它们,但它们是受支持的。
-
@aiiobe不,我相信路径可能是问题的一部分。 OP表明路径分隔符是他的主要问题。
-
@michas我不明白为什么你需要一个通配符。您事先知道所需的JAR文件,并且必须将它们与您的应用程序一起分发。不需要通配符。
-
我能够以maven方式解决我的问题:maven.apache.org/shared/maven-archiver/examples/classpath.html Maven生成正确的Manifest条目,我可以简单地使用'java -jar'。
-
在清单中的Class-Path条目中,文件夹分隔符是特定于平台的,java无法使用/在窗口中解析路径,当我更改清单并替换/用它工作时。有办法避免这种情况吗?