Mein Problem (mit MAVEN) ist nur unter Windows (nicht Linux) und nicht in der IDE (Eclipse)JDK com.sun.tools nicht nach Maven installieren
Klasse gefunden:
...
System.out.println("Location of Tools --> " + VirtualMachine.class.getProtectionDomain().getCodeSource().getLocation());
...
Ausnahme:
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
Meine Umwelt:
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**)
Mein Projekt Architektur:
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
Was funktioniert:
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_
Meine nicht -Arbeiten-Lösungen zu den lib auf Fenster in main.jar machen zu finden:
set %JAVA_HOME% ... to jdk
set %JRE_HOME% ... to jre
Ich fand eine Menge Workarounds wie zB Maven Profile und so weiter, ich testete alle von ihnen, aber nichts funktioniert ed. Einmal Ich habe es funktioniert, als ich die com.sun.tools über Maven Plugin (MVN Install ...) in das JAR kopiert. Dann hat es geklappt.
Aber ich brauche es, um die com.sun.tools dynamisch zu finden - je nach Betriebssystem Linux und Windows.
Irgendwelche Vorschläge für meine nächsten Schritte? Ich weiß nicht, was ich tun könnte, dass es funktioniert. Ich bekomme immer diese Ausnahme, wenn diese tools.jar auf Windows nach der Ausführung mit ... java -jar Main.jar
Ziel: Ich möchte Main.jar (java -jar Main.jar) auf jedem starten Ordner, den ich möchte.
UPDATE: Ich habe ein Probe-Projekt, das mit diesem Fehler für mich genau ausfällt.
Erstellen Sie einfach ein neues Maven-Projekt und fügen Sie dieses zu Main.java und zu POM hinzu. Installieren Sie es mit: mvn install und es schlägt fehl. Verwenden Sie den Eclipse-JAR-Builder und es funktioniert! WTF Warum?
Code:
...
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>
Die Klassen com.sun. * Jave war nie Teil der öffentlichen API von Java.Sie sollten nicht verwendet werden und können jederzeit geändert oder entfernt werden (und meine Java-Implementierung ist nicht in verschiedenen Anbietern vorhanden). – hardillb
IDE verwendet möglicherweise eine andere Java-Laufzeitumgebung, die in das Installationsverzeichnis eingebettet ist. Versuchen Sie, Ihren Code mit Java-Executable an diesem Ort auszuführen. –
Ich habe mein Ziel hinzugefügt, was ich tun möchte. – thunder