关于java:如何指定系统独立的类路径

How to specify a system independent classpath

我需要运行带有自定义类路径的java命令。

在Windows上我需要输入:

1
java -cp foo;bar

在Linux上我需要输入:

1
java -cp foo:bar

我们目前有一个包含第一个版本的.bat文件和一个包含第二个版本的.sh文件。 这在大多数情况下工作正常,但在Windows上的git-bash失败,这需要带有分号分隔符的shell脚本。

是否有任何系统独立的方式来编写这样的类路径?

我会想到类似的东西

1
java -cp foo -cp bar

但这不是这种方式。

目前,我看到的唯一方法是让一些shell逻辑确定操作系统并从中生成正确的命令行。

java方式有更简单的方法吗?


  • 选项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)在所有系统上都能正常工作以分离目录。


根本不要指定它。使用'java -jar'命令,使用包含Main-Class属性的Manifest.MF命名JAR文件,并在必要时使用Class-Path属性,指定此依赖的任何其他JAR的相对位置。由于这是通过空格分隔的相对URL完成的,因此它与系统无关。