You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 13:44:57