Bisher habe meine runnable Jar-Files in Eclipse über Rechtsklick auf dem Projekt / Export erzeugt.
Ich habe bei einem Projekt einige Dependencies über Maven eingebunden und ich schaffe es nicht ein funktionierendes Jar-File zu erzeugen.
Muss ich jetzt anders vorgehen ? Werden die über Maven eingebundenen Klassen miteingepackt?
Wenn Du mit Maven arbeitest dann kannst Du die Abhängigkeiten einfach über das maven-shade-plugin erzeugen. Da ist ggf. noch nicht mal groß eine Config notwendig - es kann schon reichen, dass es mit eingebunden wird beim package:
Ich verstehe Maven noch nicht so richtig.
Muss ich diesen Plugin in der pom.xml einbauen? Dort hat es aber schon ein Plugin.
Und sind das so was wie Instruktionen die Maven sagen wie das runnable Jar-File zu bauen ist ?
Ich verstehe aber dann nicht, wann das ausgeführt wird und wo das Jar-File erzeugt wird.
Ich bin schon etwas weiter gekommen und habe festgestellt, dass ich im Menü Run verschiedene Möglichkeiten habe einen Maven Build anzustossen. Ich nehme an damit starte ich den Prozess.
Im Moment läuft er noch ziemlich mit Fehlern durch aber ich taste mich heran.
Wenn ich in Eclipse mache Run --> Run as --> Maven install, läuft alles fehlerfrei durch.
Die Jar welche sich in Target befindet, kann ich aber nicht ausführen (es passiert einfach nichts).
Ich glaube kaum das "nichts" passiert. Starte die jar doch mal von der cmd shell aus statt sie nur doppelt zu klicken. Dann wirst du bestimmt eine Fehlermeldung bekommen.
Danke. Ich kriege immer noch den Fehler.
Ich glaube es liegt noch an was anderes, denn wenn ich den Build in der Cmd Zeile ausführe, dann sagt er "No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?". Wenn ich in Eclipse schaue, ist aber wohl JDK 1.8 ausgewählt.
Auf der Kommandozeile nutzt er doch die Eclipse Einstellungen nicht. Also bitte prüfen: Hast Du das JAVA_HOME gesetzt? Hast Du das entsprechende java / javac im Pfad?
Also so eine typische einfache POM sieht bei mir so aus:
XML:
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>de.telekom.ironman</groupId><artifactId>MavenTest</artifactId><version>1.0-SNAPSHOT</version><properties><java.version>8</java.version><maven.compiler.version>3.8.1</maven.compiler.version><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies>
...
</dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>${maven.compiler.version}</version><configuration><!-- release flag erst ab Java 9 verfügbar!
<release>${java.version}</release>
--></configuration></plugin><!-- Jar bekommt Manifest! --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.2.0</version><configuration><archive><manifest><mainClass>my.package.TestApp</mainClass></manifest></archive></configuration></plugin></plugins></build></project>
Darauf achten - ich setze da jetzt einige Parameter und im compiler ist ein release Flag, das erst ab Java 9 existiert!
Und wenn du ein jar mit allen Abhängigkeiten haben möchtest, dann fügst Du eifnach das Shade Plugin hinzu - das sollte schon ausreichen und kommt einfach zu den beiden schon referenzierten Plugins.
Edit: Dependencies noch gelöscht und durch ... ersetzt ...
Es hilft ungemein sich erstmal mit maven in der Shell auseinander zu setzen bevor man das alles über eine IDE macht. Tipp einfach mal einen mvn clean build ein und schau was der dir alles um die Ohren haut
Wie bezeichne ich hier meine MainClass die in keinem Package liegt ? Wenn ich schreibe <mainClass>UF</mainClass>, sagt er Could not find main Class UF.
Also wenn Du jetzt das Bild vergleichst mit dem in #5, bei dem Du noch ein Eclipse Projekt hattest: Es wird bei UF kein Default package angezeigt.
Das liegt einfach daran, dass Maven die Source Dateien in src/main/java erwartet. Und da liegt die Datei nicht. Wenn Du im jar File schaust (Einfach in .zip umbenennen und dann mit einem Tool Deiner Wahl rein schauen), dann wird da vermutlich auch kein UF.class zu finden sein sondern wohl nur META.INF mit Manifest und sonst nichts ...
Also in src ein Verzeichnis main anlegen und da drin dann ein Verzeichnis java. Dann das UF.java da rein verschieben und dann wird Eclipse vermutlich da auch wieder ein Default package anzeigen ...
Frage zum vollständigen Verständnis: du schreibst Maven erwartet die Source Dateien in src/main/java. Hat das jetzt damit zu tun, dass dies so in der effektiven POM per Default definiert ist ? somit könnte man das theoretisch überschreiben in der pom ? (ist eine rein theoretische Frage, nicht dass es mich locken würde).