Java9 导致打包库中的类出现 ClassNotFoundException

标签 java java-9

使用下面的简单应用程序时,我在使用 Java9 时遇到以下问题。 该应用程序有主类Main:

package app;

import lib.Greeting;

public class Main {
    public static void main( String[] args ) {
        System.out.println( new Greeting().hello() );
    }
}

Greeting如下,打包在单独的jar库lib.jar中:

package lib;

public class Greeting {
    public String hello() {
        return "Hi from Greeting lib!";
    }
}

应用程序Main和lib.jar由Eclipse打包到app.jar库中, list 文件如下:

**Manifest-Version: 1.0
Rsrc-Class-Path: ./ lib.jar
Class-Path: .
Rsrc-Main-Class: app.Main
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader**

当我使用 Java8 运行此应用程序时,它按预期工作:

C:\java\J9Test\libs>java -jar app.jar
Hi from Greeting lib!

当我使用 Java9 运行此应用程序时,出现以下异常:

C:\orawork\java\J9Test\libs>d:\jdk1.9\bin\java.exe -jar app.jar
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.NoClassDefFoundError: lib/Greeting
        at app.Main.main(Main.java:7)
        ... 5 more
Caused by: java.lang.ClassNotFoundException: lib.Greeting
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:466)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:563)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
        ... 6 more

如何解决此问题并使用 Java8 和 9 成功运行这个简单的应用程序?

最佳答案

显然,Eclipse 特定技术 create executable jars通过 including dependencies as nested jars (请参阅“库处理”)从 Eclipse Oxygen.1a 开始,尚未完全适应 Java 9。

根据this comment该问题已在 Oxygen.2 中修复,将于 2017 年 12 月 20 日发布(存在候选版本)。

关于Java9 导致打包库中的类出现 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47527410/

相关文章:

Java 生产者、Stompy Python 消费者、ActiveMQ

java - 为 Maven 存储库创建 jar,如何?

java - 是否可以在 Java 9 中注释 lambda 表达式?

java - 在 Java 9+ 中使用 JRE 运行时,我可以提供运行时编译器访问吗?

Java安全警告

java - 如何使用递归来处理 "chopping up"数组?

java - 为什么 Maven shade 插件会删除 module-info.class?

java - List.of(...) 或 Collections.unmodifiableList()

java - Eclipse Oxygen - 添加 JRE/JDK 9 时遇到问题

java - 如何从 Java 应用程序将 SQL 文件(存储在我的 Java 项目的源文件夹中)加载到 MySQL 中?