Java:简单 JAR 项目在运行时无法在第二个简单 JAR 项目中找到导入的类,即使第二个 JAR 通过 -classpath 传递

标签 java maven classpath

我编写了两个简单的 Java 类(其中一个包含“main()”,另一个由“main()”调用)。

#1 类(包含“main()”):

package daniel347x.outerjar;
import daniel347x.innerjar.Funky;
public class App 
{
    public static void main( String[] args )
    {
        Funky.foo();
    }
}

#2 类(由“main()”调用):

package daniel347x.innerjar;
public class Funky 
{
    public static void foo()
    {
        System.out.println( "Funky!" );
    }
}

以上类出现在不同的项目根文件夹中,并使用Maven作为构建系统(每个项目都有自己的POM)。主项目的 pom.xml 文件包含将 daniel347x.outerjar.App 添加为主类的正确条目,并且它正确包含对 daniel347x.innerjar 的依赖项。这两个项目都成功构建为 JAR 文件。

我使用 NetBeans 将它们包装为 Maven 项目(事实上,我使用 NetBeans 创建这两个项目)。当我从 NetBeans 中运行主项目时,它成功运行,并且我看到 Funky! 作为输出。

但是,当我尝试直接从 Windows 命令行 (cmd.exe) 运行主类时,在命令行的类路径上传递包含 Funky 的 JAR 文件,如下所示:

java -classpath "P:\_Dan\work\JavaProjects\JarFuckup\innerjar\target\innerjar-1.0-SNAPSHOT.jar"-jar "P:\_Dan\work\JavaProjects\JarFuckup\outerjar\target\outerjar-1.0-SNAPSHOT.jar"

...我收到可怕的 NoClassDefFoundError:

Exception in thread "main" java.lang.NoClassDefFoundError: daniel347x/innerjar/Funky
    at daniel347x.outerjar.App.main(App.java:7)

我已经仔细确认,在上面提到的包含 Funkyinnerjar JAR 文件中,路径结构是 daniel347x\innerjar 并且innerjar 文件夹内是 Funky.class 文件 - 该文件在十六进制编辑器中看起来是正确的,我可以在其中看到代表类名称的 ASCII 字符串。

无法找到该类的事实违背了我对 Java 的理解,我认为 Java 允许您将 JAR 文件作为 -classpath 参数传递,并且它将能够在这些文件中找到类JAR 文件。

这个非常基本的观点让我感到困惑 - 如果能够解释我做错了什么,我们将不胜感激。

最佳答案

使用-jar时类路径被忽略选项。运行应用程序的一种方法是 java -classpath "P:\_Dan\work\JavaProjects\JarFuckup\innerjar\target\innerjar-1.0-SNAPSHOT.jar";"P:\_Dan\work\JavaProjects\JarFuckup\outerjar\target\outerjar-1.0-SNAPSHOT.jar" daniel347x.outerjar.App

关于Java:简单 JAR 项目在运行时无法在第二个简单 JAR 项目中找到导入的类,即使第二个 JAR 通过 -classpath 传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6253694/

相关文章:

java - 在 Flex 应用程序中更改值时实时传播 DataGrid/ArrayCollection

java - maven 在 artifactory 中解析 "SNAPSHOT"

java - 如何在maven打包中包含公共(public)存储库

java - 如何使用 Liquibase 创建数据库

windows - Liquibase 多个类路径

java - logback 资源 [logback.xml] 上出现错误而不是警告 在类路径上多次出现

java - MySQL java jdbc MySQLNonTransientConnectionException : Got packets out of order

java - 检查对象是否是类列表中任何一个的实例(Android)

java - 组合框单元格编辑器上的 getSelectedRow

java - 使用自定义 SSLSocketFactory 时出现 ClassNotFoundException