Java Classpath让我发疯(找不到我的课程)

时间:2012-08-26 23:30:39

标签: java classpath classloader manifest

好的,我有以下文件树:

<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中搜索所需的类。我已经看过很多次了。

3 个答案:

答案 0 :(得分:2)

对于Linux,您应该能够做到这样的事情:

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

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

这是Java documentation

这里有点better explanation

答案 1 :(得分:1)

我有同样的问题。

  

默认的类路径是当前目录。设置CLASSPATH   变量或使用-classpath命令行选项会覆盖该变量   默认,因此如果要在搜索中包括当前目录   路径,则必须在新设置中包含点(。)。

oracle documentation

答案 2 :(得分:0)

通过系统变量或

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

然后执行java -jar MyApp.jar