Maven et ajout de JAR à la portée du système

86

J'ai un JAR dans mon projet Android et je souhaite qu'il soit ajouté au fichier APK final. D'accord, je vais ici:

    <dependency>
        <groupId>com.loopj.android.http</groupId>
        <artifactId>android-async-http</artifactId>
        <version>1.3.2</version>
        <type>jar</type>
        <scope>system</scope>
        <systemPath>${project.basedir}/libs/android-async-http-1.3.2.jar</systemPath>
    </dependency>

Mais quand je cours, mvn packageje reçois un avertissement:

[WARNING] Some problems were encountered while building the effective model for **apk:1.0
[WARNING] 'dependencies.dependency.systemPath' for com.loopj.android.http:android-async-http:jar should not point at files within the project directory, ${project.basedir}/libs/android-async-http-1.3.2.jar will be unresolvable by dependent projects @ line 36, column 25

Et dans l'APK final, il n'y a pas de JAR.

Comment résoudre ce problème?

efpies
la source
3
Vous ne pouvez pas utiliser la portée du système de cette façon. utilisez install: install-file.
bmargulies
@bmargulies Pouvez-vous nous dire à quoi sert cette portée?
efpies
1
Je suis passé à gradle et je n'ai plus ces maux de tête, sauf que maintenant j'essaye d'utiliser une bibliothèque open source avec maven et de pirater temporairement un pot (ce qui est si facile dans gradle et si difficile dans maven).
Dean Hiller
1
Cette question explique comment éviter d'utiliser la portée du système dans Maven: stackoverflow.com/questions/3642023/…
Mark Butler
Documentation officielle sur le scope 'system': maven.apache.org/guides/introduction/…
Guillaume Husta

Réponses:

24

Vous devrez ajouter le fichier jar à votre référentiel maven local. Alternativement (meilleure option) spécifiez le référentiel approprié (s'il en existe un) afin qu'il puisse être téléchargé automatiquement par maven

Dans les deux cas, supprimez la <systemPath>balise de la dépendance

Attila
la source
4
J'ai vu cet article mais j'espérais ne pas le faire maven installsur tous les ordinateurs sur lesquels je souhaite construire ce projet (malheureusement je n'ai pas trouvé ce JAR dans les dépôts). Merci! :)
efpies
1
Il peut être scripté dans le cadre de la construction.
Thorbjørn Ravn Andersen
145

Je ne connais pas la vraie raison mais Maven pousse les développeurs à installer toutes les bibliothèques (personnalisées aussi) dans certains référentiels maven, donc ce scope:systemn'est pas très apprécié, une solution de contournement simple consiste à utilisermaven-install-plugin

suivez l'usage:

écrivez votre dépendance de cette façon

<dependency>
    <groupId>com.mylib</groupId>
    <artifactId>mylib-core</artifactId>
    <version>0.0.1</version>
</dependency>

puis, ajoutez maven-install-plugin

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-install-plugin</artifactId>
    <version>2.5.2</version>
    <executions>
        <execution>
            <id>install-external</id>
            <phase>clean</phase>
            <configuration>
                <file>${basedir}/lib/mylib-core-0.0.1.jar</file>
                <repositoryLayout>default</repositoryLayout>
                <groupId>com.mylib</groupId>
                <artifactId>mylib-core</artifactId>
                <version>0.0.1</version>
                <packaging>jar</packaging>
                <generatePom>true</generatePom>
            </configuration>
            <goals>
                <goal>install-file</goal>
            </goals>
        </execution>
    </executions>
</plugin>

faites attention à phase:clean, pour installer votre bibliothèque personnalisée dans votre référentiel, vous devez exécuter mvn cleanpuismvn install

Ging3r
la source
10
Pourquoi ne pas utiliser à la <phase>process-resources</phase>place de <phase>clean</phase>. La phase processus-ressources semble plus appropriée pour un tel scénario et elle est toujours appelée avant la phase de compilation.
jplandrain
1
dans une première installation, êtes-vous sûr de pouvoir passer la phase de «validation» qui précède les ressources de processus dans le «cycle de vie construit»? ; ), le 'cycle de vie propre' vient en premier 'cycle de vie construit' et il ne dépend d'aucune validation, tutorialspoint.com/maven/maven_build_life_cycle.htm
Ging3r
5
Cela fonctionne, mais comment installer plusieurs dépendances?
Renaud Pawlak
6
Stackoverflow devrait ajouter une fonctionnalité qui permet à la communauté de remplacer le choix de la bonne réponse par OP, car à mon humble avis, cette réponse devrait être celle acceptée! :)
Vijay Chavda
2
Comme d'autres l'ont commenté, la liaison à cleanphase est très trompeuse, elle ne fait pas partie du cycle de vie par défaut et déforme le sens de clean. De plus, la modification suggérée pour utiliser une phase dans le cycle de vie par défaut (par exemple validateou process-resources) échouera dans une situation multi-module, car la résolution des dépendances est tentée par l'agrégateur, avant l' exécution des objectifs personnalisés pour les modules enfants.
Wool.in.silver
14
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

Essaye ça.

utilisateur9064925
la source
11

La portée du système a été conçue uniquement pour traiter les fichiers «système»; fichiers assis dans un emplacement fixe. Fichiers dans /usr/libou ${java.home}(par exemple tools.jar). Il n'a pas été conçu pour prendre en charge divers .jarfichiers dans votre projet.

Les auteurs ont intentionnellement refusé de faire fonctionner les extensions de chemins pour que cela vous décourage. En conséquence, à court terme, vous pouvez utiliser install:install-filepour installer dans le dépôt local, puis un jour utiliser un gestionnaire de dépôt pour partager.

bmargulies
la source
3

Utilisez un gestionnaire de référentiel et installez-y ce type de fichiers jar. Cela résout vos problèmes à tous et pour tous les ordinateurs de votre réseau.

khmarbaise
la source
3
Nous avions prévu d'exécuter un dépôt sur un serveur local demain ou après demain, mais avant cela, je devrais résoudre ce problème d'une autre manière.
efpies
1
Comme @efpies l'a mentionné, cela peut être une réponse circulaire lorsqu'un développeur n'a pas les autorisations / la capacité de créer un gestionnaire de dépôt.
StephenBoesch
De nos jours, si vous avez installé docker, tout ce dont vous avez besoin est docker run -d -p 8081:8081 --name nexus sonatype/nexus3- voir hub.docker.com/r/sonatype/nexus3 pour plus de détails.
Thorbjørn Ravn Andersen
3

Essayez cette configuration. Cela a fonctionné pour moi:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <warSourceDirectory>mywebRoot</warSourceDirectory>
        <warSourceExcludes>source\**,build\**,dist\**,WEB-INF\lib\*,
            WEB-INF\classes\**,build.*
        </warSourceExcludes>
        <webXml>myproject/source/deploiement/web.xml</webXml>
        <webResources>
            <resource>
                <directory>mywebRoot/WEB-INF/lib</directory>
                <targetPath>WEB-INF/lib</targetPath>
                <includes>
                        <include>mySystemJar1.jar.jar</include>
                         <include>mySystemJar2.jar</include>
                   </includes>
            </resource>
        </webResources>
    </configuration>
</plugin>
sofiene zaghdoudi
la source
0

mvn install: install-file -DgroupId = com.paic.maven -DartifactId = tplconfig-maven-plugin -Dversion = 1.0 -Dpackaging = jar -Dfile = tplconfig-maven-plugin-1.0.jar -DgeneratePom = true

Installez le fichier jar dans le référentiel local.

gaiement
la source
3
C'est compliqué que d'ajouter directement via le pompon.
Pradeeban Kathiravelu
0

Grâce à Ging3r, j'ai la solution:

Suivez ces étapes:

  1. ne pas utiliser dans la balise de dépendance. Utilisez la balise suivante dans les dépendances dans le fichier pom.xml:

    <dependency>
    <groupId>com.netsuite.suitetalk.proxy.v2019_1</groupId>
    <artifactId>suitetalk-axis-proxy-v2019_1</artifactId>
    <version>1.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.netsuite.suitetalk.client.v2019_1</groupId>
        <artifactId>suitetalk-client-v2019_1</artifactId>
        <version>2.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.netsuite.suitetalk.client.common</groupId>
        <artifactId>suitetalk-client-common</artifactId>
        <version>1.0.0</version>
    </dependency>
    
  2. utilisez le code suivant dans la balise plugins du fichier pom.xml:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.5.2</version>
            <executions>
                <execution>
                    <id>suitetalk-proxy</id>
                    <phase>clean</phase>
                    <configuration>
                        <file>${basedir}/lib/suitetalk-axis-proxy-v2019_1-1.0.0.jar</file>
                        <repositoryLayout>default</repositoryLayout>
                        <groupId>com.netsuite.suitetalk.proxy.v2019_1</groupId>
                        <artifactId>suitetalk-axis-proxy-v2019_1</artifactId>
                        <version>1.0.0</version>
                        <packaging>jar</packaging>
                        <generatePom>true</generatePom>
                    </configuration>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                </execution>
                <execution>
                    <id>suitetalk-client</id>
                    <phase>clean</phase>
                    <configuration>
                        <file>${basedir}/lib/suitetalk-client-v2019_1-2.0.0.jar</file>
                        <repositoryLayout>default</repositoryLayout>
                        <groupId>com.netsuite.suitetalk.client.v2019_1</groupId>
                        <artifactId>suitetalk-client-v2019_1</artifactId>
                        <version>2.0.0</version>
                        <packaging>jar</packaging>
                        <generatePom>true</generatePom>
                    </configuration>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                </execution>
                <execution>
                    <id>suitetalk-client-common</id>
                    <phase>clean</phase>
                    <configuration>
                        <file>${basedir}/lib/suitetalk-client-common-1.0.0.jar</file>
                        <repositoryLayout>default</repositoryLayout>
                        <groupId>com.netsuite.suitetalk.client.common</groupId>
                        <artifactId>suitetalk-client-common</artifactId>
                        <version>1.0.0</version>
                        <packaging>jar</packaging>
                        <generatePom>true</generatePom>
                    </configuration>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    

J'inclus 3 jars du dossier lib:

y compris le pot externe dans le projet de démarrage de printemps

Enfin, utilisez mvn cleanand then mvn installou 'mvn clean install' et exécutez simplement le fichier jar à partir du dossier cible ou du chemin où install (voir le mvn installjournal):

java -jar abc.jar

Remarque: souvenez-vous d'une chose si vous travaillez chez jenkins, puis utilisez d'abord mvn clean, puis la mvn clean installcommande fonctionne pour vous, car avec le mvn clean installcache de magasin de commandes de code précédent pour les dépendances.

Ankit
la source