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

时间:2009-06-01 20:20:59

标签: java command-line 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

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

7 个答案:

答案 0 :(得分:5)

不,你不能。

运行带有-jar的jar不涉及任何类型的路径机制,因为jar文件类路径。

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:3)

根据to Sun

java -jar app.jar
  

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

     

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

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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

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

  1. 设置环境变量
  2. 设置别名
  3. 可能使用符号链接(到文件或目录)。
  4. 可能有用的是找出为什么指定整个路径是一个问题。这可以指导我们哪个答案最好,或者可能找到完全不同的解决方案。

答案 5 :(得分:0)

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

java fullclassname arg1 arg2

Mac OSX Developer Library recommends'需要放在系统类路径上的其他jar文件放在/Library/Java/Extensions文件夹中。您也可以将它们放在自己的Library/Java/Extensions文件夹中,但您可能需要创建JavaExtensions文件夹。

如果您不知道.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在你的类路径中,请使用classname,而不需要路径名。

答案 6 :(得分:0)

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

另一种方法可能是使用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扩展bash-completion或zsh-completion。例如,java -jar的bash-completion将文件列表限制为* .jar文件。为方便使用,有人可以通过查看当前路径而不是$ JAR_PATH来扩展它。作为起点,请参阅以下unix.sx question

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