Maven e l'aggiunta di JAR all'ambito del sistema


86

Ho un JAR nel mio progetto Android e voglio che venga aggiunto all'APK finale. Va bene, eccomi qui:

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

Ma quando corro mvn packagericevo un avviso:

[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

E nell'APK finale non ci sono JAR.

Come lo risolvo?


3
Non è possibile utilizzare l'ambito del sistema in questo modo. usa install: install-file.
bmargulies

@bmargulies Puoi dire a cosa serve questo scopo?
efpies

1
Sono passato a gradle e non ho più questi mal di testa tranne che ora sto cercando di utilizzare una libreria open source con Maven e hackerare temporaneamente un vaso (che è così facile in Gradle e così difficile in Maven).
Dean Hiller

1
Questa domanda ha una discussione su come evitare di utilizzare l'ambito del sistema in Maven: stackoverflow.com/questions/3642023/…
Mark Butler,

Documentazione ufficiale sul 'sistema' dell'ambito
Guillaume Husta

Risposte:


24

Dovrai aggiungere il vaso al tuo repository Maven locale. In alternativa (opzione migliore) specificare il repository appropriato (se esiste) in modo che possa essere scaricato automaticamente da Maven

In entrambi i casi, rimuovi il <systemPath>tag dalla dipendenza


4
Ho visto quell'articolo ma speravo di non farlo maven installsu tutti i computer in cui voglio costruire quel progetto (purtroppo non ho trovato questo JAR nei repository). Grazie! :)
efpies

1
Può essere scritto come parte della build.
Thorbjørn Ravn Andersen

145

Non conosco il vero motivo ma Maven spinge gli sviluppatori a installare tutte le librerie (anche personalizzate) in alcuni repository esperti, quindi scope:systemnon è molto apprezzato, Una semplice soluzione alternativa è usaremaven-install-plugin

segui l'utilizzo:

scrivi la tua dipendenza in questo modo

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

quindi, aggiungi 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>

phase:cleanfai attenzione , per installare la tua libreria personalizzata nel tuo repository, devi eseguire mvn cleane poimvn install


10
Perché non usare <phase>process-resources</phase>invece di <phase>clean</phase>. La fase delle risorse di processo sembra più appropriata per un tale scenario e viene sempre chiamata prima della fase di compilazione.
jplandrain

1
in una prima installazione, sei sicuro di poter superare la fase di "convalida" che precede le risorse di processo nel "ciclo di vita costruito"? ; ), il "ciclo di vita pulito" viene prima del "ciclo di vita costruito" e non ha dipendenze con alcuna convalida, tutorialspoint.com/maven/maven_build_life_cycle.htm
Ging3r

5
Funziona, ma come installi diverse dipendenze?
Renaud Pawlak

6
Stackoverflow dovrebbe aggiungere una funzionalità che consenta alla comunità di ignorare la scelta della risposta corretta da parte di OP, perché IMHO, questa risposta dovrebbe essere quella accettata! :)
Vijay Chavda

2
Come altri hanno commentato, il binding alla cleanfase è molto fuorviante, non fa parte del ciclo di vita predefinito e distorce il significato di clean. Inoltre, la modifica suggerita per utilizzare una fase nel ciclo di vita predefinito (ad esempio validateo process-resources) fallirà in una situazione multi-modulo, poiché la risoluzione delle dipendenze viene tentata dall'aggregatore, prima che qualsiasi obiettivo personalizzato venga eseguito per i moduli figlio.
wool.in.silver

14
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

Prova questo.


11

L'ambito del sistema è stato progettato solo per gestire i file "di sistema"; file che si trovano in una posizione fissa. File in /usr/lib, o ${java.home}(ad esempio tools.jar). Non è stato progettato per supportare .jarfile vari nel progetto.

Gli autori hanno intenzionalmente rifiutato di far funzionare correttamente le espansioni del nome del percorso per scoraggiarti. Di conseguenza, a breve termine è possibile install:install-fileeseguire l'installazione nel repository locale e poi un giorno utilizzare un gestore di repository da condividere.


3

Usa un gestore di repository e installa questo tipo di jar al suo interno. Questo risolve i tuoi problemi e per tutti i computer della tua rete.


3
Abbiamo programmato di eseguire un repo sul server locale domani o dopo domani, ma prima dovrei risolvere questo problema in un altro modo.
efpies

1
Come menzionato da @efpies, questa potrebbe essere una risposta a torta quando uno sviluppatore non dispone delle autorizzazioni / capacità per creare un repo manager.
StephenBoesch

In questi giorni, se hai installato docker, tutto ciò di cui hai bisogno è docker run -d -p 8081:8081 --name nexus sonatype/nexus3- vedi hub.docker.com/r/sonatype/nexus3 per i dettagli.
Thorbjørn Ravn Andersen

3

Prova questa configurazione. Ha funzionato per me:

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

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

Installa il jar nel repository locale.


3
Questo è ingombrante che aggiungere direttamente attraverso il pom.
Pradeeban Kathiravelu

0

Grazie a Ging3r ho la soluzione:

Segui questi passi:

  1. non utilizzare nel tag di dipendenza. Usa quanto segue nel tag delle dipendenze nel file 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. usa il seguente codice nel tag dei plugin nel file 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>
    

Sto includendo 3 barattoli dalla cartella lib:

compreso il vaso esterno nel progetto di avvio di primavera

Infine, usa mvn cleane poi mvn installo 'mvn clean install' ed esegui semplicemente il file jar dalla cartella di destinazione o il percorso in cui installa (vedi mvn installregistro):

java -jar abc.jar

nota: ricorda una cosa se stai lavorando a jenkins, prima usa mvn cleane poi il mvn clean installcomando funziona per te perché con il codice precedente mvn clean installmemorizza la cache per la dipendenza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.