Java Maven安装后未找到JDK com.sun.tools

Java Maven安装后未找到JDK com.sun.tools,java,windows,maven,jar,classnotfoundexception,Java,Windows,Maven,Jar,Classnotfoundexception,我的问题(MAVEN)只存在于Windows(不是Linux)上,而不存在于IDE(Eclipse)中 类别: ... System.out.println("Location of Tools --> " + VirtualMachine.class.getProtectionDomain().getCodeSource().getLocation()); ... 例外情况: Exception in thread "main" java.l

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

类别:

    ...

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

    ...
例外情况:

        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安装…)将com.sun.tools复制到JAR中时,我成功了。然后它成功了

但我需要它来动态查找com.sun.tools,具体取决于操作系统linux和windows。

对我的下一步有什么建议吗?我不知道我能做什么才能让它工作。 在windows上使用tools.jar时,在使用…java-jar Main.jar执行后,我总是会遇到这个异常

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


更新: 我添加了一个示例项目,由于这个错误,该项目完全失败。

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

代码:

POM:


1.8
1.8
1.8
com.sun
工具
1.8
系统
${env.JAVA_HOME}/lib/tools.jar
org.apache.maven.plugins
maven汇编插件
3.0.0
C:\输出\
com.test.Main
带有依赖项的jar
假的
组装
包裹
单一的

我知道这不是当前问题的解决方案,但我正在使用一种变通方法,我可以向任何其他人推荐。我现在正在使用它,因为它具备了我所需要和想要的所有功能


但是不管怎样,如果有人能为这个maven安装(可能是maven{java.home}bug?)问题找到一个有效的解决方案,那就太好了。

我知道这不是解决当前问题的方法,但我正在使用一个变通方法,我可以向任何其他人推荐它。我现在正在使用它,因为它具备了我所需要和想要的所有功能


但是不管怎样,如果有人能为这个maven安装(可能是maven{java.home}bug?)问题找到一个有效的解决方案,那就太好了。

com.sun.*类从来都不是java公共API的一部分。它们不应该被使用,并且可以随时随意更改或删除(我的代码甚至不存在于不同供应商的Java实现中)。IDE可能正在使用嵌入其安装目录中的不同Java运行时。尝试在该位置使用java可执行文件执行代码。我添加了我想要实现的目标。您需要通过反射在代码中处理该目标,因为这些类并不存在于每个JDK/JRE上……我需要的是如何通过pom或s.th正确定位tools.jar。像这样,检查示例plz.com.sun.*类从未成为Java公共API的一部分。它们不应该被使用,并且可以随时随意更改或删除(我的代码甚至不存在于不同供应商的Java实现中)。IDE可能正在使用嵌入其安装目录中的不同Java运行时。尝试在该位置使用java可执行文件执行代码。我添加了我想要实现的目标。您需要通过反射在代码中处理该目标,因为这些类并不存在于每个JDK/JRE上……我需要的是如何通过pom或s.th正确定位tools.jar。像这样,检查示例plz。
    ...

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

    ...
    <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>