scaricare ed eseguire file jar dal repository maven remoto


Potrebbe essere una domanda stupida ma in qualche modo non riesco a capirlo (anche con le molte risposte già date su stackoverflow) come farlo:

  • Ho creato un progetto maven
  • Ho chiamato mvn package e posso eseguire il file jar con java -jar... e tutto funziona bene.
  • Dopo aver distribuito il jar nel repository remoto, voglio che tutti nel mio team siano in grado di chiamare semplicemente un comando maven (come mvn exec:java o qualcosa del genere) sulla riga di comando e Maven deve scaricare il file jar dal repository remoto ed eseguirlo.

Indipendente dalla directory corrente in cui si trova l'utente. Come faccio? Attualmente ricevo il messaggio di errore che ho bisogno di essere in una directory con un pom esistente.file xml.

    <project xmlns="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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.1.RELEASE</version>
    </parent>
    <groupId>handof.nod</groupId>
    <artifactId>clirunnertest</artifactId>
    <version>1.0</version>
    <name>CLIRunnerTest</name>
    <description>Kleines Testprogramm um zu testen wie Spring Boot auf der Command Line funktioniert</description>
    <packaging>jar</packaging>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <!-- Package as an executable jar/war -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <executable>java</executable>
                    <arguments>
                        <argument>-jar</argument>
                        <argument>target/clirunnertest-1.0.jar</argument>
                    </arguments>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
Author: Javier C., 2017-10-26

2 answers

Le tue esigenze sono piuttosto specifiche, ci sono modi per fare ciò che vuoi, ma potresti non trovarli adatti alle tue esigenze. In poche parole, i tuoi requisiti sono:

  • Scarica un artefatto Maven da un repository ed eseguilo (supponendo che sia disponibile su un repository)
  • MA questo deve essere "indipendente dalla directory corrente in cui si trova l'utente", cioè l'utente dovrebbe essere in grado di eseguire la riga di comando da qualsiasi luogo-questo è il difficile parte, perché la maggior parte dei plugin Maven richiede un pom e nessuno sarà disponibile.

Soluzione 1:

Quello che puoi fare è, in una singola riga di comando, scaricare il tuo artefatto dal repository ed eseguirlo, con qualcosa del tipo:

mvn org.apache.maven.plugins:maven-dependency-plugin:3.0.2:copy -Dartifact=handof.nod:clirunnertest:1.0.0:jar -DoutputDirectory=. && java -jar clirunnertest.jar 

Quello che fa è:

  1. Scarica il file jar usando maven-dependency-plugin (che non richiede alcun POM, lucky us)
  2. Esegui un comando java con il tuo jar appena scaricato (ci sono varianti come java -cp clirunnertest.jar MyMainClass

Soluzione 2:

Soluzione 1 richiede all'utente di specificare il comando java e il suo argomento, non molto flessibile. Con questa soluzione sarete in grado di cambiare il modo in cui il comando viene eseguito senza influire sull'utente finale.

Per prima cosa dovrai creare un piccolo progetto contenente la tua configurazione exec:java o exec:exec e caricarlo nel tuo repository Maven, insieme al jar che vuoi eseguire. Hai solo bisogno di scrivere un pom autonomo.xml con il tuo barattolo dipendenza e relativa configurazione exec come:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="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>handof.nod</groupId>
    <artifactId>clirunnertest-pomrunnerproject</artifactId>
    <version>0.1</version>
    <packaging>pom</packaging>

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.6.0</version>
                <executions>
                    <execution>
                        <id>run-java</id>
                        <goals>
                            <goal>java</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <mainClass>handof.nod.clirunnertest.MainClassOrWhatever</mainClass>
                    <arguments>
                        <argument>bla</argument>
                    </arguments>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>handof.nod</groupId>
            <artifactId>clirunnertest</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>
</project>

Una volta che questo progetto è disponibile sul repository Maven, è possibile eseguire:

mvn org.apache.maven.plugins:maven-dependency-plugin:3.0.2:copy -Dartifact=handof.nod:clirunnertest-pomrunnerproject:0.1:pom -DoutputDirectory=. && mvn exec:java -f clirunnertest-pomrunnerproject-0.1.pom

Che scaricherà il pom per questo progetto ed eseguirà come qualsiasi altro progetto Maven.

Puoi anche farlo in due volte, prima scaricare il pom con l'obiettivo di copia da qualche parte sulla tua macchina, quindi eseguirlo da qualsiasi luogo specificando il percorso del pom scaricato usando -f parametro:

mvn exec:java -f /path/to/the/pom/clirunnertest-pomrunnerproject-0.1.pom

Ciò consente di eseguire questo comando da qualsiasi punto purché si specifichi il percorso del pom.


Come vedi, anche se funzionano, queste soluzioni (e molte varianti che puoi immaginare come queste, come avere uno script bash disponibile su Nexus, avendo detto la configurazione in un pom genitore e usando un sottoprogetto con il parametro -f per usarlo da qualsiasi luogo, ecc.) non sono realmente flessibili né facili da usare e distribuire. Maven potrebbe non essere il il miglior strumento per ottenere ciò che vuoi, anche se implementare il tuo plugin come hai discusso potrebbe essere una soluzione;)

 1
Author: Pierre B., 2017-10-27 11:32:11

Non c'è un solo passaggio per farlo, e Maven generalmente vuole essere in grado di usare ~/.cartella m2 come area di lavoro. Tu puoi tuttavia farlo in due passaggi.

  1. Scarica l'artefatto direttamente con dependency:get - vedi Come posso scaricare uno specifico artefatto Maven in una riga di comando? per i dettagli.
  2. Quindi hanno il file jar e possono avviarlo come al solito.

È anche possibile creare un pom.file xml per esso che gli utenti possono scaricare (di nuovo come artefatto) e quindi configurarlo per mvn exec:java.

Se questo è qualcosa che vuoi fare regolarmente, suggerirò una distribuzione regolare! Java WebStart funziona bene se si dispone di un server Web da qualche parte è possibile memorizzare i file.

 0
Author: Thorbjørn Ravn Andersen, 2017-10-26 22:50:57