2014-07-03 4 views
6

Se conosco le coordinate di un artefatto, e un nome della classe all'interno di quel manufatto, posso fare Maven correre la classe, tra cui tutte le sue dipendenze nel classpath Java?Come posso eseguire una classe Java all'interno di un artefatto Maven, risolvendo automaticamente le dipendenze?

Ad esempio, supponiamo che un collega mi abbia parlato di uno strumento che posso eseguire, che viene pubblicato sul nostro Nexus interno con le coordinate degli artefatti example:cool-tools:1.0.0. Ho usato this answer per scaricare l'artefatto. Ora, so che il nome della classe principale è example.Main. Ma se mi basta andare al percorso di download del manufatto e corro java -cp cool-tools-1.0.0.jar example.Main, ottengo NoClassDefFoundError s per eventuali dipendenze di cool-tools.

Sono a conoscenza dello maven-exec-plugin, ma per quanto posso dire è solo per i progetti in cui si ha la fonte. Supponiamo che io non abbia accesso all'origine, solo il Nexus che contiene lo strumento (e tutte le sue dipendenze). Idealmente, farei qualcosa come mvn exec:exec -DmainArtifact='example:cool-tools:1.0.0' -DmainClass='example.Main', ma non credo che il plugin exec sia effettivamente in grado di farlo.

ETA: Per essere chiari, I non hanno un progetto locale/POM. Voglio farlo usando solo dalla riga di comando, senza scrivere un POM, se possibile.

+0

dubito fortemente che si può raggiungere questo obiettivo senza utilizzare un pom. Potrebbe essere in grado di costruire un pom temporaneo sulla riga di comando anche se, come nel seguente: echo "" | mvn -f - – Torsten

+0

Non possibile. Il pom elenca le dipendenze, senza di esso non dovrai mai fare in modo che Maven costruisca un percorso di classe. –

+0

@Coderer La tua ipotesi sul plugin exec è sbagliata. È possibile definire la dipendenza in un pom separato in cui si definiscono le dipendenze e lasciare che il plugin exec consenta di eseguire la classe. – khmarbaise

risposta

7

non esiste una soluzione out-of-the-box per il vostro compito. Ma puoi creare un semplice script per risolverlo:

  • Scaricare pom.xml dal tuo strumento dal repository.
  • Scarica il barattolo del tuo strumento.
  • Scarica tutte le sue dipendenze.
  • eseguire Java con le librerie risolti.

Riga di comando:

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

Directory ./target conterrà il vostro strumento + tutte le dipendenze.

Vedere i dettagli su dependency:copy e mojos dependency:copy-dependencies.

Modifica

In alternativa, è possibile costruire classpath utilizzando le librerie nel repository locale:

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

Vedi dettagli sul build-classpath mojo.

+0

E 'necessario copiare tutti quei vasi su "target"? Il classpath non può essere costruito direttamente da artefatti nel repository locale di Maven? – Thilo

+0

non è necessario copiare. vedi aggiornamento – ursa

+1

Penso che 'dependency: build-classpath' sia una grossa fetta della risposta che stavo cercando. Non ho ancora avuto la possibilità di eseguirlo, ma se effettivamente si assicura che le dipendenze siano nel repository locale, in primo luogo, questo risolve il mio problema. Dovrò provarlo! – Coderer

1

è possibile scaricare il pom dal repository utilizzando wget, per esempio. Quindi risolvere le dipendenze e creare il classpath esportandolo in un file usando Maven. Infine, esegui con Java e il classpath costruito usando qualcosa come i backtick di bash per usare il contenuto del file.

proprio come in this answer.

0

u possibile utilizzare IDE come IntelliJ IDEA che risolve automaticamente le dipendenze come u li scrivere nel vostro pom

0

Come è stato detto da altri già non esiste una soluzione senza creare un POM in più.

Una soluzione potrebbe essere quella di utilizzare il Maven Shade Plugin in questo POM: "Questo plugin fornisce la possibilità di confezionare il manufatto in un super-vaso, incluse le dipendenze"

Credo il Executable JAR è vicino a quello cosa ti piacerebbe ottenere.

0

Per me il primo anwer ha quasi funzionato, ma ho dovuto modificare leggermente la sceneggiatura. Alla fine sono arrivato (su macchina Windows) per seguente soluzione:

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

Sulla macchina Unix/Linux nel l'ultimo comando il punto e virgola ";" deve essere sostituito con due punti ":". Quando devono essere forniti argomenti di input, basta metterli nell'ultima riga dello script:

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