2014-08-29 62 views
3

我需要运行带有自定义类路径的java命令。如何指定一个与系统无关的类路径

在Windows上我需要键入:

java -cp foo;bar 

在Linux上我需要键入:

java -cp foo:bar 

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

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

我想的有点像

java -cp foo -cp bar 

但这并不这样。

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

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

+0

如何在Windows下运行shell脚本? – Jens 2014-08-29 08:11:05

+0

是的,bash也适用于windows。例如,如果你安装了git,它包含一个非常漂亮的shell:git-bash。 – michas 2014-08-29 08:12:45

+2

不是我所知道的。想到的最接近的事情是将类路径信息放在清单中并将其打包在jar中。 – aioobe 2014-08-29 08:14:26

回答

1

请不要指定它。使用'java -jar'命令,用包含Main-Class属性的Manifest.MF命名JAR文件,必要时还可以使用Class-Path属性,指定其依赖的任何其他JAR的相对位置。由于这是通过空格分隔的相对URL完成的,因此它是自动独立于系统的。

+0

*由于这是通过相对URL完成的,因此它是自动独立于系统的。* - 似乎表明您相信存在问题的*路径*。 Java在Windows和* nix上接受具有'/'的类路径。它是平台特定的*路径分隔符*。 – aioobe 2014-08-29 10:03:01

+0

Class-Path属性是否允许使用像'lib/*'这样的通配符? (快速测试不起作用。)classpath中的路径与当前工作目录相关,对吗? – michas 2014-08-29 10:04:54

+0

不,清单文件不支持类路径通配符。请参阅http://docs.oracle.com/javase/6/docs/technotes/tools/windows/classpath.html:*但是,类路径通配符在Class-Path jar-manifest头文件中不受支持*它们受支持当在班级路径上提供时。 – aioobe 2014-08-29 10:06:20

2
  • 选项1:如果你不介意运行前创建一个罐子,你可以在清单文件中指定的类路径。这些路径是空间分隔的。对于使用例如uname检测OS(见Adding Classes to the JAR File's Classpath

  • 选项2添加代码。然后执行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} 
    

注:只有路径分隔符,即; VS :,是特定于平台。正斜杠(即some/class/path)在分离目录的所有系统上都正常工作。

+1

当前选项3('SEP = $(java -h |&grep“A [:;]分隔的”| grep -o“[:;]”)')仅适用于英文语言环境。 (SE)= $([$(java -h |&grep“;”| wc -l)== 1]这是我的成功(在德语* Windows 7 *和英语* Ubuntu 14.04 LTS *上成功测试过) && echo“;”|| echo“:”)' – Abdull 2016-04-22 14:10:41

+0

选项3必须是一个笑话。 – 0xF 2017-11-21 21:17:27

+0

@ 0xF,这有点冒险,但如果你想到它,正在运行的系统上的'java'命令是分隔符符号'java'接受的唯一真值源。 'java -h'碰巧打印了正确的符号。增加了第四个选项,这可能不那么hacky,但需要JDK。 – aioobe 2017-11-21 21:51:06

相关问题