【问题标题】:How to specify a system independent classpath如何指定与系统无关的类路径
【发布时间】:2014-10-23 05:19:28
【问题描述】:

我需要使用自定义类路径运行 java 命令。

在 Windows 上我需要输入:

java -cp foo;bar

在 Linux 上我需要输入:

java -cp foo:bar

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

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

我会想到类似的东西

java -cp foo -cp bar

但事实并非如此。

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

有没有更简单的java方式来做到这一点?

【问题讨论】:

  • 如何在windows下运行shell脚本?
  • 是的,bash 也可用于 Windows。例如,如果你安装 git,它包含一个非常好的 shell:git-bash。
  • 我不知道。想到的最接近的事情是将类路径信息放在清单中并将其打包到 jar 中。

标签: java command-line classpath


【解决方案1】:
  • 选项 1: 如果您不介意在运行前创建 jar,您可以在清单文件中指定类路径。这些路径是空间分隔的。 (见Adding Classes to the JAR File's Classpath

  • 选项 2 添加用于检测操作系统的代码,例如使用 uname。然后执行SEP=\;SEP=: 并使用path${SEP}path。 (例如参见How to check if running in Cygwin, Mac or Linux?

  • 选项 3: Grep java 帮助输出以查看 java 期望的分隔符:

    SEP=$(java -h |& grep "A [:;] separated" | grep -o "[:;]")
    
  • 选项4:如果你安装了JDK,可以打印File.pathSeparator

    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}
    

注意:只有 路径分隔符,即 ;:,是特定于平台的。正斜杠(即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,这有点骇人听闻,但如果你想一想,运行系统上的java 命令是java 接受的分隔符符号的唯一真实来源。 java -h 恰好打印了正确的符号。添加了第四个选项,它可能不那么 hacky,但需要 JDK。
【解决方案2】:

根本不要指定它。使用“java -jar”命令,使用包含 Main-Class 属性的 Manifest.MF 命名 JAR 文件,如果需要,还可以使用 Class-Path 属性,指定任何其他 JAR 的 relative 位置一个取决于。由于这是通过空格分隔的相对 URL 完成的,因此它自动独立于系统。

【讨论】:

  • 由于这是通过相对 URL 完成的,因此它自动独立于系统。 -- 似乎表明您相信 paths 是有问题的。 Java 在 Windows 和 nix 上都接受带有 / 的类路径。它是特定于平台的 *路径分隔符
  • Class-Path 属性是否允许使用像lib/* 这样的通配符? (快速测试没有奏效。)类路径中的路径是相对于当前工作目录的,对吧?
  • 不,清单文件中不支持类路径通配符。请参阅docs.oracle.com/javase/6/docs/technotes/tools/windows/…但是,Class-Path jar-manifest 标头中不支持类路径通配符。但在类路径中提供它们时支持它们。
  • @aiiobe 不,我相信路径可能是问题的部分。 OP表示路径分隔符是他的主要问题。
  • @michas 我不明白你为什么需要通配符。您事先知道所需的 JAR 文件,并且必须将它们与您的应用程序一起分发。通配符 ergo 不是必需的。
猜你喜欢
  • 2018-01-22
  • 2013-11-24
  • 1970-01-01
  • 2022-10-13
  • 2018-10-29
  • 2020-04-10
  • 1970-01-01
  • 2011-02-23
相关资源
最近更新 更多