0

我创建了一个需要包含 tools.jar 的 Maven 项目。我已将 jar 添加到 lib 文件夹中,并在 pom.xml 中包含以下内容。

<dependency>
            <groupId>com.sun</groupId>
            <artifactId>tools</artifactId>
            <scope>system</scope>
            <version>1.8.0</version>
            <systemPath>${project.basedir}\src\lib\tools.jar</systemPath>
</dependency>

何时还添加了以下插件来为项目创建可执行 jar。

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>umlparser.Main</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>

我已经使用“mvn clean package assembly:single”构建了 jar 这已经创建了一个名为 myproject-jar-with-dependencies 的可执行 jar 文件。

但是当我尝试使用 java -jar 运行 jar 文件时,它无法获取 tools.jar。我收到以下错误

Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/javadoc/Main
        at org.umlgraph.doclet.UmlGraph.main(UmlGraph.java:70)
        at umlparser.Main.main(Main.java:19)
Caused by: java.lang.ClassNotFoundException: com.sun.tools.javadoc.Main
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 2 more

但是当我将它作为可运行的 jar 从 eclipse 导出时,它按预期工作。maven包有什么问题?我在这里错过了什么吗?

编辑

我试图从 java_home 而不是项目路径导入 tools.jar 依赖项。

<dependency>
            <groupId>com.sun</groupId>
            <artifactId>tools</artifactId>
            <version>1.8.0_241</version>
            <scope>system</scope>
            <systemPath>${java.home}/../lib/tools.jar</systemPath>
        </dependency>

我仍然遇到同样的问题。

注意:我的程序中没有使用 tools.jar。我包含的其中一个罐子正在使用它 - “UMLGraph.jar”。

4

1 回答 1

1

您添加的com.sun:tools依赖项具有system范围。provided与和范围的依赖关系system不会包含在此类打包的工件中。

特别是在这种情况下,您实际上也不应该这样做,因为这个 jar 是您的 JDK 的一部分。你的 jar 的用户将有一个 JDK/JRE 来运行代码,如果你包含toolsjar,你很可能会与他们的 JDK/JRE 发生冲突,你真的不想这样做。

话虽这么说,您可能可以尝试使用dependencySeta scopeof system,但我真的不建议这样做(即使它成功了)。

我假设在您运行此 jar 的系统上,您根本没有 JDK,PATH而您只有 JRE。如果你解决了这个问题,你不应该做任何这种非常规的黑客攻击。

于 2020-04-23T10:13:37.757 回答