télécharger et exécuter le fichier jar à partir du référentiel maven distant


Cela pourrait être une question stupide mais je ne peux pas le comprendre (même avec les nombreuses réponses déjà données sur stackoverflow) comment le faire:

  • , j'ai créé un projet maven
  • , j'ai appelé mvn package et peut exécuter le fichier jar avec java -jar ... et tout fonctionne bien.
  • Après avoir déployé le jar dans le référentiel distant, je veux que tout le monde dans mon équipe puisse simplement appeler une commande maven (comme mvn exec:java ou quelque chose comme ça) sur la ligne de commande et Maven doit télécharger le fichier jar du référentiel distant et l'exécuter.

Indépendamment du répertoire courant dans lequel se trouve l'utilisateur. Comment je fais cela ? Actuellement, je reçois le message d'erreur que je dois être dans un répertoire avec un pom existant.fichier 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

Vos exigences sont assez spécifiques, il existe des moyens de faire ce que vous voulez, mais vous ne les trouverez peut-être pas adaptés à vos besoins. En un mot, vos exigences sont:

  • Téléchargez un artefact Maven à partir d'un dépôt et exécutez-le (en supposant qu'il soit disponible sur un dépôt)
  • MAIS cela doit être "indépendant du répertoire actuel dans lequel se trouve l'utilisateur" , c'est-à-dire que votre utilisateur doit pouvoir exécuter la ligne de commande de n'importe où - c'est le plus délicat partie, parce que la plupart des plugins Maven nécessitent un pom et aucun ne sera disponible.

Solution 1:

Ce que vous pouvez faire, c'est, en une seule ligne de commande, télécharger votre artefact à partir du dépôt et l'exécuter, avec quelque chose comme:

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 

Ce qu'il fait est:

  1. Téléchargez le fichier jar en utilisant le maven-dependency-plugin (qui ne nécessite aucun POM, lucky us)
  2. Exécutez une commande java avec votre jar fraîchement téléchargé (il existe des variantes telles que java -cp clirunnertest.jar MyMainClass

Solution 2:

Solution 1 nécessite que votre utilisateur spécifie la commande java et son argument, pas très flexible. Avec cette solution, vous pourrez modifier la façon dont la commande s'exécute sans impacter l'utilisateur final.

Vous devrez d'abord créer un petit projet contenant votre configuration exec:java ou exec:exec et le télécharger dans votre référentiel Maven, avec le jar que vous souhaitez exécuter. Il vous suffit d'écrire un pom autonome.xml avec votre bocal dépendance et configuration associée exec telle que:

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

Une fois ce projet disponible sur votre référentiel Maven, vous pouvez exécuter:

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

Qui téléchargera le pom pour ce projet et l'exécutera comme tout autre projet Maven.

Vous pouvez également le faire en deux fois, d'abord télécharger le pom avec l'objectif de copie quelque part sur votre machine, puis l'exécuter de n'importe où en spécifiant le chemin d'accès au pom téléchargé à l'aide du -f paramètre:

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

Cela vous permet d'exécuter cette commande de n'importe où tant que vous spécifiez le chemin du pom.


Comme vous le voyez, bien qu'elles fonctionnent, ces solutions (et de nombreuses variantes que vous pouvez imaginer comme celles-ci, comme avoir un script bash disponible sur Nexus, avoir ladite configuration dans un pom parent et utiliser un sous-projet avec le paramètre -f pour l'utiliser de n'importe où, etc.) ne sont pas vraiment flexibles ni faciles à utiliser et à distribuer. Maven peut ne pas être le le meilleur outil pour réaliser ce que vous voulez, bien que l'implémentation de votre propre plugin comme vous l'avez discuté puisse être une solution;)

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

Il n'y a pas une seule étape pour le faire, et Maven veut généralement pouvoir utiliser le ~/.dossier m2 comme zone de travail. Vous peut cependant de le faire en deux étapes.

  1. Téléchargez l'artefact directement avec dependency:get - voir Comment puis-je télécharger un artefact Maven spécifique dans une ligne de commande? pour plus de détails.
  2. Ensuite, ils ont le fichier jar et peuvent le démarrer comme d'habitude.

Vous pouvez également créer un pom.fichier xml pour cela que les utilisateurs peuvent télécharger (encore une fois comme un artefact), puis configurez-le pour mvn exec:java.

Si c'est quelque chose que vous voulez faire sur une base régulière, je suggérerai un déploiement régulier! Java WebStart fonctionne bien si vous avez un serveur Web quelque part, vous pouvez stocker les fichiers.

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