java - Maven 安装后找不到 JDK com.sun.tools

标签 java windows maven jar classnotfoundexception

我的问题(与MAVEN)仅存在于Windows(而不是Linux)上,而不是在IDE(Eclipse)中

类(class):

    ...

    System.out.println("Location of Tools --> " + VirtualMachine.class.getProtectionDomain().getCodeSource().getLocation());

    ...

异常(exception):

        Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/attach/VirtualMachine
                at my.package.bootstrap(Controller.java:37)
                at my.package.main(Main.java:35)
        Caused by: java.lang.ClassNotFoundException: com.sun.tools.attach.VirtualMachine
                at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
                at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
                at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
                at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
                ... 2 more

我的环境:

Windows: Windows 10 (Here are the Problems!!!)
Linux: Xubuntu 16.04 (Works fine)
Java: 8 oracle (not openjdk!)
Maven (**using the maven-assembly-plugin for installing**)

我的项目架构:

My Project which using the com.sun.tools is a library: lib.jar
which gets used by Main Project: Main.jar.

I'm using maven to compile all of that into Main.jar

什么有效:

Linux Eclipse IDE: found
Linux - Shell: java -jar myjar.jar: found

Windows Eclipse IDE: found
--> Windows - Bash: /java_jdk_path/java -jar myjar.jar: _NOT_FOUND_

我的工作解决方案使其在main.jar中找到Windows上的库:

set %JAVA_HOME%  ... to jdk
set %JRE_HOME% ... to jre

我发现了很多解决方法,例如 Maven 配置文件等,我测试了所有这些,但没有任何效果。一度 当我通过 maven 插件(mvn install...)将 com.sun.tools 复制到 JAR 中时,我成功了。然后就成功了。

但我需要它来动态查找 com.sun.tools - 取决于操作系统 Linux 和 Windows。

对我接下来的步骤有什么建议吗?我不知道我能做什么才能让它起作用。 在使用 ...java -jar Main.jar 执行后,在 Windows 上使用此 tools.jar 时,我总是遇到此异常

目标:我想在我想要的任何文件夹上启动 Main.jar (java -jar Main.jar)。

<小时/>

更新: 我添加了一个示例项目,但由于此错误,该项目对我来说失败了。

只需创建一个新的 Maven 项目并将其添加到 Main.java 并到 POM。使用: mvn install 安装它,但失败。 使用 eclipse jar 构建器并且它可以工作!??? WTF 为什么?

代码:

    ...

    System.out.println("Location of Tools --> " + VirtualMachine.class.getProtectionDomain().getCodeSource().getLocation());

    ...

POM:

    <properties>
            <java.version>1.8</java.version>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.sun</groupId>
            <artifactId>tools</artifactId>
            <version>1.8</version>
            <scope>system</scope>
            <systemPath>${env.JAVA_HOME}/lib/tools.jar</systemPath>
        </dependency>
    </dependencies>

    <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>3.0.0</version>
                    <configuration>
                        <outputDirectory>C:\Output\</outputDirectory>
                        <archive>
                            <manifest>
                                <mainClass>com.test.Main</mainClass>
                            </manifest>
                        </archive>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                        <appendAssemblyId>false</appendAssemblyId>
                    </configuration>
                    <executions>
                        <execution>
                            <id>make-assembly</id> <!-- this is used for inheritance merges -->
                            <phase>package</phase> <!-- bind to the packaging phase -->
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
    </build>

最佳答案

我知道这不是当前问题的解决方案,但我正在使用一种解决方法,并且我可以将其推荐给任何其他人。我正在使用https://github.com/oshi/oshi现在,因为它具有我需要并希望通过 com.sun.tools 获得的所有功能。

但无论如何,很高兴听到是否有人对这个 Maven 安装(也许是 Maven {java.home} bug?)问题有一个有效的解决方案。

关于java - Maven 安装后找不到 JDK com.sun.tools,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41590827/

相关文章:

maven - Maven 设置和 POM 中的配置文件名称相同

java - 单击基于 div 中某些文本的按钮

java - 编译后数组越界错误

java - Java 中的幂运算符?

php - 如何在 Windows 托管服务器上运行 .php 文件

c - Window 中文件夹的结构?

java - 无法在 apt 处理器类中初始化 Velocity 引擎

java - 你能从类文件创建java文件吗?反编译

c++ - 使用 CREATE_NEW_CONSOLE 从 CreateProcess 获取用户输入

java - Maven 在构建期间排除文件