【问题标题】:How to set CLASSPATH in Linux to let java find jar file?如何在Linux中设置CLASSPATH让java查找jar文件?
【发布时间】:2013-06-07 07:25:08
【问题描述】:

在 Linux 下我试图运行一个 jar 文件,如下所示:

java -jar plantuml.jar -testdot

同时将CLASSPATH 设置为以下任何一项(文件位于/home/user/plantuml.jar):

export CLASSPATH=/home/user
export CLASSPATH=/home/user/
export CLASSPATH=/home/user/plantuml.jar

在任何一种情况下,无论我如何定义CLASSPATHjava 命令都会给出错误Unable to access jarfile plantuml.jar。我在这里做错了什么?

【问题讨论】:

  • 你试过java可执行文件的-cp参数吗?
  • 您确定您的 jar 在 Java 意义上是可执行的吗? MANIFEST.MF 是否有主类条目?在这种情况下,Classpat 似乎无关紧要。

标签: java linux classpath


【解决方案1】:

您必须在参数-jar 之后提供完整路径。因此,对于您的示例,您必须调用

java -jar /home/user/plantuml.jar -testdot

$CLASSPATH 仅被评估以查找其他文件(类/资源),而不是在命令行中定义的 jar 文件。

【讨论】:

  • 他不能使用java -cp /home/user -jar plantuml.jar -testdot 吗?
  • @vikingsteve 不,这是不可能的。 -jar后面的参数必须是全路径名。
  • 我的印象是CLASSPATH 可以用来设置java 正在寻找的东西的路径,就像我迄今为止遇到的任何其他编程语言一样。我将通过在我的.bashrc 中定义一些东西来解决这个问题,以避免每次我想使用这个命令时都输入完整的路径名。
  • " java 在哪里寻找东西" - 不完全是。 ClassLoaders 使用它按名称查找资源。 -jar 选项的参数不是一回事。
【解决方案2】:
export CLASSPATH="/path/to/class_or_jar1":"/path/to/class_or_jar2":"${CLASSPATH}" 

【讨论】:

    【解决方案3】:

    也许您缺少主类的名称或 jar 的路径。你试过执行吗:

    java -jar full_path/plantuml.jar package.YourClass -testdot
    

    您的程序是否依赖于其他类?如果是,您可能需要添加 -cp 参数。

    【讨论】:

    • 在 OP 问题中并非如此。如果在清单中命名了类名并且使用-jar 参数调用了jar,则无需命名类名。此外,错误消息表明找不到 jar 文件。
    【解决方案4】:

    当您通过名称引用类时,类路径用于查找类。它本质上是一个路径列表(目录和 jar/zip 文件),当使用 ClassLoader.getResourceAsStream() 之类的方法时,JVM 需要在其中查找类或其他资源。

    传递给命令行中 -jar 选项的值是 JAR 文件的文件路径。

    因此,如果您仅按名称引用 jar 文件,它将找不到 jar 文件。 CLASSPATH 中的 JAR 文件路径应该是“包含”其他资源的路径元素。

    你需要在这里做的,要么是

    1. 在尝试执行 jar 时提供 jar 文件的完整路径
    2. 将类路径设置为 jar 文件的路径,然后运行 ​​java 命令并给出要执行的主类的名称。

    【讨论】:

      猜你喜欢
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 2016-06-26
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多