2016-07-26 28 views
2

Ich habe ein Maven-Projekt, das ich irgendwie kompilieren muss, so dass ich in der Lage wäre, die kompilierte Datei auf eine andere Maschine zu übertragen und dann ausführen Java-Version). Ich sah diese auf SO questionWie Maven-basiertes Java-Projekt zu kompilieren, um es von der Befehlszeile

und konnte auszuführen:

mvn clean install 
mvn dependency:copy-dependencies 

Doch als ich versuchte:

cd target/ 
java -cp myApp-0.0.1.jar:dependency myApp 

Ich habe

Error: Could not find or load main class myApp 

Mein pom.xml nicht der Fall ist habe mvn-assembly-plugin oder maven-jar-plugin (und ich bekomme die .jar erfolgreich Ziel/nach mvn sauber installieren).

Ich bin nicht sicher, ob diese Schritte zu meinem Ziel gehören, denn was ich brauche, ist etwas zu erstellen, das ohne java-jar oder mvn ausgeführt wird und auf einem anderen Computer portiert und ausgeführt werden kann.

Antwort

3

Es gibt Maven Build-Plugin, das alle Ihre Abhängigkeiten in einer JAR bündeln würde. Sie könnten es einfach mit

java -jar mybundled.jar 

ohne Berücksichtigung von Klassenpfadabhängigkeiten ausführen.

Und hier kommt das Maven Plugin. Ersetzen Sie die MainClass durch Ihren Einstiegspunkt.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.4.1</version> 
    <configuration> 
     <descriptorRefs> 
     <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs>  
     <archive> 
     <manifest> 
      <mainClass>com.yourdomain.Main</mainClass> 
     </manifest> 
     </archive> 
    </configuration> 
    <executions> 
     <execution> 
     <id>make-assembly</id> 
     <phase>package</phase> 
     <goals> 
      <goal>single</goal> 
     </goals> 
     </execution> 
    </executions> 
</plugin> 

Als es an die package lifecycle gebunden ist, würden Sie Ihre gebündelt JAR in Ihrem Zielverzeichnis finden, nachdem ein tun ...

mvn package 

In Bezug auf Ihre Sorge, dass der Code nicht auf einem anderen laufen Maschine, Java ist plattformunabhängig und allgemein können Sie sich darauf verlassen. Allerdings kommen mir drei Dinge in den Sinn, die das Leben schwer machen können:

  1. Ihr Code hängt von der Systemcodierung ab. Maven sollte Sie darüber im Protokoll warnen und Sie auffordern, es explizit anzugeben.
  2. Sie interagieren mit der Laufzeitumgebung, wie das Ausführen von Systembefehlen. ps wird nicht auf Windows und dir /s wahrscheinlich nicht auf * nix arbeiten.
  3. Die Version Ihrer Java-Umgebung unterscheidet sich. Natürlich wird JavaFX-Code nicht mit einem Java 1.5 ausgeführt. Wenn Sie die neuesten Funktionen nutzen, stellen Sie sicher, dass Ihre Kunden bereits die entsprechende Version haben oder sie zumindest von irgendwo bekommen können. Vielleicht haben Sie einen Blick auf die source und target Kompilierungsoptionen nehmen wollen, auch: http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#crosscomp-example
+1

Alles klar, alles funktionierte, aber weil ich einige Konfigurationsdateien in 'src/main/config' befindet verwende, muss ich Führen Sie das Glas aus dem obersten Ordner in der Art "java -jar target/mybundled.jar" aus. Ich werde sehen, wie es geht, es auf eine andere Maschine zu portieren (mein Anliegen ist, dass ich Java habe und dann die .jar möglicherweise nicht korrekt läuft. Wird es überhaupt möglich sein, sie auf einem anderen Rechner auszuführen?) und dann werde ich es als Antwort nehmen – alisa

+0

Ich bin froh, dass ich helfen konnte. Ich habe meinem Beitrag einen Kommentar zu Ihren plattformübergreifenden Bedenken hinzugefügt. – Matt

+0

Nizza hinzufügen. Der 3. Punkt vermittelt, worum es mir am meisten gekümmert hat. In meinem speziellen Fall habe ich 'java --version' auf dem entfernten Host überprüft, und es war 1,8, also würde es ab heute kein Problem geben (Juli 2016). Aber danke, dass Sie auf diesen Link hingewiesen haben und wie Sie dieses Problem im Allgemeinen angehen können. – alisa