解决Eclipse插件转独立jar时java -jar找不到主类的问题
解决
java -jar无法找到Eclipse插件主类的问题 问题本质
你碰到的ClassNotFoundException原因很明确:
- 普通JVM的
java -jar命令不支持OSGi的Bundle-ClassPath配置,只遵循标准JAR的类加载规则——默认从JAR根目录查找类。 - 当前你的类被打包在JAR内部的
bin/子目录里,而MANIFEST.MF里的Class-Path: bin/是指向外部的bin目录,不是JAR内部的路径,完全无效。
推荐方案:将类打包到JAR根目录
这是Java独立应用的标准做法,操作只需修改pom.xml和MANIFEST.MF:
1. 调整编译输出目录
修改pom.xml的<build>部分,把编译输出从bin改成Maven默认的target/classes,确保类文件生成在标准位置:
<build> <!-- 替换原bin目录为Maven标准目录 --> <outputDirectory>target/classes</outputDirectory> <!-- 其他配置保留 --> </build>
2. 配置Tycho打包规则
更新tycho-packaging-plugin,让它把target/classes的内容打包到JAR根目录,同时修正Bundle-ClassPath:
<plugin> <groupId>org.eclipse.tycho</groupId> <artifactId>tycho-packaging-plugin</artifactId> <version>4.0.0</version> <!-- 指定Tycho版本,避免兼容问题 --> <configuration> <bundleClassPath> <list> <item>.</item> <!-- 表示JAR根目录 --> <!-- 保留依赖JAR的路径,注意要和打包后的实际位置对应 --> <item>target/dependency/antlr4-runtime-4.13.2.jar</item> <!-- 其他依赖JAR依次添加 --> </list> </bundleClassPath> <manifestLocation>META-INF</manifestLocation> </configuration> </plugin>
3. 修正MANIFEST.MF
删除冗余的Class-Path: bin/,并把Bundle-ClassPath调整为:
Bundle-ClassPath: ., target/dependency/antlr4-runtime-4.13.2.jar, target/dependency/konveyor-base-0.2.7-testing.jar
4. 重新打包并测试
执行mvn clean package生成新JAR,然后运行:
java -jar target/inez-model-0.4.1.jar
此时JVM能直接从JAR根目录找到主类,解决ClassNotFoundException。
不推荐的备选方案:修改MANIFEST.MF适配bin目录
如果硬要保留类在JAR内部的bin/目录,无法通过标准java -jar实现——因为JVM不支持从JAR内部的子目录作为类路径根。你只能放弃-jar参数,用以下命令运行(但要求bin目录在JAR外部,和打包结构冲突):
java -cp your-plugin.jar:bin/ io.github.magwas.inez.Main
这种方式破坏了独立JAR的便携性,不建议使用。
内容的提问来源于stack exchange,提问作者Árpád Magosányi
相关产品推荐
相关产品推荐

