【问题标题】:Java Classpath drives me crazy (Doesn't find my classes)Java Classpath 让我发疯(找不到我的类)
【发布时间】:2012-08-26 23:30:38
【问题描述】:

好的,所以我有以下文件树:

<appfolder>
- MyApp.jar
- lib/
-    log.jar
-    someother.jar
-    someother.jar
-    someother2.jar
- config.properties
- otherfiles.extension

我已经尝试了几十种方法来启动这个应用程序。 MyApp 包含以下内容

MANIFEST.MF:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.3
Created-By: 1.7.0_06-b24 (Oracle Corporation)
Main-Class: myapp.Main
Class-Path: MyApp.jar lib/*

如果我调用 java -jar MyApp.jar,它总是说 lib/log.jar 中的所有类都无法加载。

这是我尝试过的部分组合:

- *.jar lib/*
- *.jar lib/*.jar
- *.jar ./lib/*.jar
- ./*.jar lib/*.jar
- *.jar ./lib/*.jar
- tbc

没有任何效果。 Java 总是告诉我它在 lib/log.jar 中找不到类

我的下一个尝试是通过命令行指定类路径。

java -cp "MyApp.jar:lib/*" myapp.Main

但即使这样也行不通。在这种情况下,Java 说它找不到 myapp.Main 类。

我想我做错了什么,因为我发现没有任何方法有效。如果我将 lib/log.jar 中的类放入 myApp.jar 并启动它,它将起作用。但这不是解决办法。

有什么想法吗?

编辑: 我不想命名每一个 lib jar。我只想让 ClassLoader 在 ClassPath 中搜索所需的类。我已经看过很多次了。

【问题讨论】:

  • 我不确定,但我认为您不能在清单文件中使用通配符。如果您从字面上列出所有像Class-Path: lib/a.jar lib/b.jar 这样的罐子,它肯定会起作用。作为另一种组合,你可以试试Class-Path: lib/**(注意2星不是错字)

标签: java classpath classloader manifest


【解决方案1】:

对于 Linux,您应该能够执行以下操作:

java -cp MyApp.jar:lib:someotherjar.jar myapp.Main

您可以(可选!)对包含“main”的 .jar 使用“-jar”,或者您可以添加路径和 jar 文件的任意组合(具有限定路径名的 .jar 文件) 到你的类路径。

这是Java documentation

这里有点better explanation

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。

    默认的类路径是当前目录。设置类路径 变量或使用 -classpath 命令行选项覆盖 默认,所以如果你想在搜索中包含当前目录 路径,那么您必须在新设置中包含一个点 (.)。

    oracle documentation

    【讨论】:

      【解决方案3】:

      通过系统变量或通过

      将 lib 目录添加到您的类路径
      SET CLASSPATH=%CLASSPATH%;MYAPP/LIB;.
      

      然后做一个java -jar MyApp.jar

      【讨论】:

      • 问题是类路径的构造,不管是在环境变量还是java命令本身。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      • 2011-05-30
      • 2012-11-02
      • 2020-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多