问题 是否可以调用可执行的.jar文件而不必使用其完整路径?


我有一个.jar文件,我希望能够调用,而无需使用完整的文件路径到它的位置。

例如,如果.jar文件位于:/some/path/to/thearchive.jar

我希望能够运行它:

java -jar thearchive.jar

代替:

java -jar /some/path/to/thearchive.jar

当我在目录树的其他地方。在我的具体情况下,我正在运行安装了OS X 10.5.7的Mac。 Java版“1.5.0_16”。我尝试将“/ some / path / to”添加到PATH,JAVA_HOME和CLASSPATH,但这不起作用。

那么,如何设置从命令行运行.jar而不必使用其完整路径?

更新:另一个要处理的项目是参数。例如:

java -jar /some/path/to/thearchive.jar arg1 arg2

这可能会影响问题的处理方式,如下面的答案中所述。


1493
2018-06-01 20:20


起源

注意,命令:java -jar thearchive.jar可以正常工作,如果我在.jar文件的目录中(在示例中:“/ some / path / to”。)目标是我当前的工作目录是:/ some / other / place / on / the / tree仍然只是使用:java -jar thearchive.jar而不必使用fullpath。 (即java -jar /some/path/to/thearchive.jar - Alan W. Smith


答案:


您可以添加一个变量来保存目录:

export JARDIR=/some/path/to
java -jar $JARDIR/thearchive.jar

我不确定你是否可以隐式地从环境变量中做到这一点。


3
2018-06-01 20:33



@Brabster - 好主意 - 你也可以将环境变量设置为“/some/path/to/thearchive.jar”和“java -jar $ JAR” - jabbie
当您需要向其传递其他参数时,这比别名更好一些。我正在使用.jar的完整路径,随后是@jabbie并使用“java -jar $ JAR”调用然后传递参数。这是按预期工作的。 - Alan W. Smith


不,你不能。

运行一个罐子 -jar 从jar文件开始不涉及任何类路径机制  类路径。

或者使用shell别名来启动jar或小脚本文件。


5
2018-06-01 20:35





根据 到太阳

java -jar app.jar

要从其他目录中的jar文件运行应用程序,我们需要指定该目录的路径,如下所示: java -jar path/app.jar

其中path是此app.jar所在的目录路径。

因此要么在“标准”环境变量中输出路径,要么定义一个包含在PATH中的包装器


3
2018-06-01 20:37



正如@Brabster的回答和@jabbie的后续描述中所述,我正在导出.jar文件的完整路径,如:export THEJAR = / some / path / to / thearchive.jar并通过以下方式运行:java -jar $ THEJAR这允许我也根据需要发送参数,例如:java -jar $ THEJAR arg1 arg2一切都按预期工作。 - Alan W. Smith


我不相信。如果您在CLASSPATH中指定了jar,则可以使用指定的主类调用java。 (即java com.test.Main)或者你可以在shell中创建一个别名来执行命令

alias execJar="java -jar /some/path/to/thearchive.jar"

或者另一种方法是创建一个包装器脚本来执行它。


1
2018-06-01 20:34



这个答案很有帮助,但它会遇到传递其他参数的问题。只要你不需要传递额外的参数(我在最初的问题中没有列出),这应该可以正常工作。 - Alan W. Smith
@stimulatingpixels您可以将其他参数传递给别名命令,或者如果您需要将它们插入任意位置,请创建一个函数。还可以编写包装器脚本以传递其他参数。 - jabbie


Java系统本身并没有为您提供一种指定类似JAR_PATH(查找jar文件的位置列表)的方法。给出的其他答案使用MAC / Unix shell功能:

  1. 设置环境变量
  2. 设置别名
  3. 可能使用符号链接(到文件或目录)。

可能有用的是找出为什么指定整个路径是一个问题。这可以指导我们哪个答案最好或者可能找到一个完全不同的解决方案来解决您的问题。


0
2018-06-01 22:25



这只是一个方便的问题。其中一个具体示例是Sun的多模式XML验证器(MSV),我用它通过命令行来验证针对模式的XML文件。当我在.xml和.xsd文件所在的目录中的终端时,能够执行类似“java -jar $ MSV schema.xsd doc.xml”而不是“java -jar / path /”的操作更好。 to / the / real / msv.jar schema.xsd doc.xml“。 - Alan W. Smith
在这种情况下,使用环境变量或别名可能会解决您的问题。 - Kathy Van Stone


要在不键入完整路径的情况下运行.jar文件,可以将其放在类路径中并通过键入以下命令运行它:

java fullclassname arg1 arg2

Mac OSX开发人员库 建议 '需要放在系统类路径上的其他jar文件放在 /Library/Java/Extensions 夹。你也可以把它们放在自己的 Library/Java/Extensions 文件夹,但你可能要创建 Java 和 Extensions 文件夹。

如果您不知道.jar文件中主类的全名,可以展开它并查看 MANIFEST.MF 文件中 META-INF 夹。该 Main-Class:线会告诉你。

所以,例如,运行 saxon9he.jar 把它放进去 /Library/Java/Extensions 你可以输入(从你想要的任何文件夹)

java net.sf.saxon.Transform arg1 arg2...

几乎和打字一样短 java -jar jarfile.jar arg1 arg2,您不需要更改任何环境变量。

简而言之,如果jar在您的类路径中,请使用类名,而不需要路径名。


0
2018-04-24 20:04





由于罐子的位置没有额外的命令行选项,或者考虑了环境变量,我也不知道一个简单的解决方案,但也会对它非常感兴趣。

另一种方法可能是使用zsh包装器脚本来获得这样的行为:

〜/ .scripts / java#.scripts在$ PATH变量中的先前位置而不是java本身

#!/usr/bin/env zsh
# get -jar option and remove from $@ (-D option)
zparseopts -D jar:=jarname 
if [ -e $JAR_PATH/$jarname[2] ];
then
    java -jar $JAR_PATH/$jarname[2] $@
elif [ -e $jarname[2] ];
then
    java -jar $jarname[2] $@
else
    java $@
fi

一个优点 zparseopts 是它可以剥离-jar选项,但所有其他选项都保留在$ @中。

进一步的改进将是扩展 庆典完成 或者java命令选项-jar的zsh-completion。例如bash-completion of java -jar 将文件列表限制为* .jar文件。为方便使用,有人可以通过查看当前路径而不是$ JAR_PATH来扩展它。作为起点,请参阅以下内容 unix.sx问题

但是这个解决方案看起来也不太好。


0
2017-09-27 13:55