2014-07-03 9 views
6

Wenn ich die Koordinaten eines Artefakts und einen Namen der Klasse innerhalb dieses Artefakts kenne, kann ich Maven veranlassen, die Klasse einschließlich aller Abhängigkeiten auf dem Java-Klassenpfad auszuführen?Wie kann ich eine Java-Klasse innerhalb eines Maven-Artefakts ausführen und Abhängigkeiten automatisch auflösen?

Angenommen, ein Mitarbeiter erzählte mir von einem Tool, das ich ausführen kann und das auf unserem internen Nexus mit den Artefaktkoordinaten example:cool-tools:1.0.0 veröffentlicht wurde. Ich habe this answer verwendet, um das Artefakt herunterzuladen. Jetzt weiß ich, dass der Hauptklassenname example.Main ist. Aber wenn ich einfach zum Download-Ort des Artefakts gehe und java -cp cool-tools-1.0.0.jar example.Main starte, bekomme ich NoClassDefFoundError s für alle Abhängigkeiten von cool-tools.

Ich kenne die maven-exec-plugin, aber soweit ich das sagen kann, ist das nur für Projekte, wo Sie die Quelle haben. Angenommen, ich habe keinen Zugriff auf die Quelle, nur das Nexus, das das Werkzeug (und alle seine Abhängigkeiten) enthält. Im Idealfall würde ich etwas wie mvn exec:exec -DmainArtifact='example:cool-tools:1.0.0' -DmainClass='example.Main' machen, aber ich glaube nicht, dass das exec-Plugin tatsächlich dazu in der Lage ist.

ETA: Um klar zu sein, habe ich nicht haben ein lokales Projekt/POM. Ich möchte dies mit nur die Befehlszeile, ohne ein POM, wenn möglich zu schreiben.

+0

ich stark bezweifeln, dass Sie dies erreichen können, ohne einen pom zu verwenden. Es könnte jedoch möglich sein, ein temporäres Pom in der Befehlszeile zu erstellen, wie im Folgenden: echo "" | mvn -f - – Torsten

+0

Nicht möglich. Der Pom listet die Abhängigkeiten auf, ohne sie wird maven niemals einen Klassenpfad erstellen. –

+0

@Coderer Ihre Annahme über das exec-Plugin ist falsch. Sie können die Abhängigkeit in einem separaten Pom definieren, wo Sie die Abhängigkeiten definieren und das Exec-Plugin die Klasse ausführen lassen. – khmarbaise

Antwort

7

Es gibt keine Standardlösung für Ihre Aufgabe. Aber Sie können ein einfaches Skript erstellen, um es zu lösen:

  • Laden Sie pom.xml von Ihrem Tool aus dem Repo.
  • Download Glas Ihres Werkzeugs.
  • Laden Sie alle Abhängigkeiten herunter.
  • Führen Sie Java gegen aufgelöste Bibliotheken.

Befehlszeile:

> mvn dependency:copy -Dartifact=<tool.group.id>:<tool.artifact.id>:<tool.version>:pom -DoutputDirectory=target 
> mvn dependency:copy -Dartifact=<tool.group.id>:<tool.artifact.id>:<tool.version> -DoutputDirectory=target 
> mvn dependency:copy-dependencies -f target/<tool.artifact.id>-<tool.version>.pom -DoutputDirectory=target 
> java -cp target/* <tool.main.class> 

Verzeichnis ./target Ihr Werkzeug + alle Abhängigkeiten enthalten.

Siehe Details auf dependency:copy und dependency:copy-dependencies mojos.

> mvn dependency:build-classpath -DincludeScope=runtime -f target/<tool.artifact.id>-<tool.version>.pom [-Dmdep.outputFile=/full/path/to/file] 

Details siehe build-classpath mojo:

bearbeiten

Als Alternative können Sie Classpath mit Bibliotheken im lokalen Repo durch aufzubauen.

+0

Ist es notwendig, alle diese Gläser auf "Ziel" zu kopieren? Kann der Klassenpfad nicht direkt aus Artefakten im lokalen Maven-Repository erstellt werden? – Thilo

+0

ist es nicht notwendig zu kopieren. siehe Update – ursa

+1

Ich denke, Abhängigkeit: Build-Classpath ist ein großer Teil der Antwort, die ich suchte. Ich hatte noch keine Gelegenheit, es zu starten, aber wenn es wirklich dafür sorgt, dass die Abhängigkeiten zuerst im lokalen Repo sind, löst das im Grunde mein Problem. Ich muss es ausprobieren! – Coderer

1

Sie könnten den Pom zum Beispiel unter Verwendung von wget aus dem Repository herunterladen. Lösen Sie dann die Abhängigkeiten, und erstellen Sie den Klassenpfad, indem Sie ihn mit Maven in eine Datei exportieren. Schließlich führen Sie mit Java und dem eingebauten Klassenpfad etwas wie bash backticks aus, um den Inhalt der Datei zu verwenden.

Genau wie in this answer.

0

u IDEs wie IntelliJ IDEA können die Abhängigkeiten automatisch auflösen wie u sie in Ihrem pom schreiben

0

Wie von anderen erwähnt wurde schon gibt es keine Lösung ohne eine zusätzliche POM zu schaffen.

Eine Lösung könnte sein, die Maven Shade Plugin in diesem POM zu verwenden: „Dieses Plugin die Möglichkeit bietet, das Artefakt in einem uber-jar zu verpacken, einschließlich ihrer Abhängigkeiten“

ich denke, die Executable JAR nahe derjenigen Was möchtest du erreichen?

0

Für mich funktionierte der erste anwer fast, aber ich musste das Skript etwas anpassen. Am Ende kam ich (auf Windows-Rechner) zu folgenden Lösung:

> mvn dependency:copy -Dartifact=<tool.group.id>:<tool.artifact.id>:<tool.version>:pom -DoutputDirectory=target 
> mvn dependency:copy -Dartifact=<tool.group.id>:<tool.artifact.id>:<tool.version> -DoutputDirectory=target 
> mvn dependency:copy-dependencies -f target/<tool.artifact.id>-<tool.version>.pom -DoutputDirectory=target 
> cd target 
> java -cp target/*;<tool.artifact.id>-<tool.version>.jar <tool.main.class> 

Auf Unix/Linux-Rechner in dem letzten Befehl des Semikolon ";" muss durch Doppelpunkt ":" ersetzt werden. Wenn Eingabeargumente zur Verfügung gestellt werden müssen, stellen sie nur in der letzten Skriptzeile:

> java -cp target/*;<tool.artifact.id>-<tool.version>.jar <tool.main.class> arg1 arg2 ... 
Verwandte Themen