Maven i dodawanie plików JAR do zakresu systemu

86

Mam plik JAR w moim projekcie na Androida i chcę, aby został dodany do końcowego pliku APK. Dobra, zaczynam:

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

Ale kiedy biegam mvn package, otrzymuję ostrzeżenie:

[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

W ostatecznym APK nie ma plików JAR.

Jak to naprawić?

efpies
źródło
3
W ten sposób nie możesz używać zakresu systemu. użyj install: install-file.
bmargulies
@bmargulies Czy możesz powiedzieć, do czego służy ten zakres?
efpies
1
Przerzuciłem się na gradle i nie mam już tych bólów głowy, z wyjątkiem tego, że teraz próbuję użyć biblioteki open source z maven i tymczasowo włamać się do słoika (co jest tak łatwe w gradle i tak trudne w maven).
Dean Hiller
1
To pytanie zawiera dyskusję, jak uniknąć używania zakresu systemowego w Maven: stackoverflow.com/questions/3642023/ ...
Mark Butler
Oficjalna dokumentacja dotycząca „systemu” lunety
Guillaume Husta

Odpowiedzi:

24

Będziesz musiał dodać słoik do lokalnego repozytorium Maven. Alternatywnie (lepsza opcja) określ właściwe repozytorium (jeśli takie istnieje), aby mogło być automatycznie pobierane przez maven

W obu przypadkach usuń <systemPath>tag z zależności

Attila
źródło
4
Widziałem ten artykuł, ale miałem nadzieję, że nie zrobię tego maven installna każdym komputerze, na którym chcę zbudować ten projekt (niestety nie znalazłem tego JARa w repozytoriach). Dzięki! :)
efpies
1
Można go utworzyć skryptem jako część kompilacji.
Thorbjørn Ravn Andersen
145

Nie znam prawdziwego powodu, ale Maven zmusza programistów do zainstalowania wszystkich bibliotek (także niestandardowych) w niektórych repozytoriach Maven, więc scope:systemnie jest lubiany. Prostym obejściem jest użyciemaven-install-plugin

postępuj zgodnie z użyciem:

zapisz swoją zależność w ten sposób

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

następnie dodaj 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>

zwróć uwagę phase:clean, aby zainstalować własną bibliotekę w swoim repozytorium, musisz uruchomić mvn cleani wtedymvn install

Ging3r
źródło
10
Dlaczego nie użyć <phase>process-resources</phase>zamiast <phase>clean</phase>. Faza zasobów procesowych wydaje się bardziej odpowiednia dla takiego scenariusza i jest zawsze wywoływana przed fazą kompilacji.
jplandrain
1
Czy w pierwszej instalacji jesteś pewien, że możesz przejść fazę „walidacji”, która następuje przed zasobami procesowymi w „zbudowanym cyklu życia”? ; ), `` czysty cykl życia '' jest na pierwszym miejscu `` zbudowany cykl życia '' i nie ma zależności od żadnej weryfikacji, tutorialspoint.com/maven/maven_build_life_cycle.htm
Ging3r
5
Działa, ale jak zainstalować kilka zależności?
Renaud Pawlak,
6
Stackoverflow powinien dodać funkcję, która pozwoli społeczności zmienić wybór poprawnej odpowiedzi przez OP, ponieważ IMHO, ta odpowiedź powinna być zaakceptowana! :)
Vijay Chavda
2
Jak zauważyli inni, powiązanie z cleanfazą jest bardzo mylące, nie jest częścią domyślnego cyklu życia i zniekształca znaczenie clean. Ponadto sugerowana zmiana polegająca na użyciu fazy w domyślnym cyklu życia (np. validateLub process-resources) zakończy się niepowodzeniem w sytuacji wielomodułowej, ponieważ agregator podejmuje próbę rozwiązania zależności przed wykonaniem jakichkolwiek niestandardowych celów dla modułów podrzędnych.
wool.in.silver
14
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

Spróbuj tego.

user9064925
źródło
11

Zakres systemu został zaprojektowany tylko do obsługi plików „systemowych”; pliki znajdujące się w jakiejś stałej lokalizacji. Pliki w /usr/liblub ${java.home}(np tools.jar.). Nie został zaprojektowany do obsługi różnych .jarplików w Twoim projekcie.

Autorzy celowo odmówili wprowadzenia rozszerzeń nazw ścieżek, aby Cię zniechęcić. W rezultacie, na krótką metę możesz użyć install:install-filedo zainstalowania w lokalnym repozytorium, a następnie pewnego dnia użyć menedżera repozytorium do udostępnienia.

bmargulies
źródło
3

Użyj menedżera repozytorium i zainstaluj w nim tego rodzaju pliki słoików. To rozwiązuje wszystkie Twoje problemy i dla wszystkich komputerów w Twojej sieci.

khmarbaise
źródło
3
Planowaliśmy uruchomić repozytorium na lokalnym serwerze jutro lub jutro, ale wcześniej powinienem rozwiązać ten problem w inny sposób.
efpies
1
Jak wspomniał @efpies, może to być odpowiedź typu pie-in-the-sky, gdy programista nie ma uprawnień / możliwości tworzenia menedżera repo.
StephenBoesch,
W dzisiejszych czasach, jeśli masz zainstalowany docker, wszystko, czego potrzebujesz, to docker run -d -p 8081:8081 --name nexus sonatype/nexus3- zobacz hub.docker.com/r/sonatype/nexus3, aby uzyskać szczegółowe informacje.
Thorbjørn Ravn Andersen
3

Wypróbuj tę konfigurację. U mnie zadziałało:

<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
źródło
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

Zainstaluj jar w lokalnym repozytorium.

wietrznie
źródło
3
Jest to kłopotliwe niż bezpośrednie dodawanie przez pompon.
Pradeeban Kathiravelu
0

Dzięki Ging3r otrzymałem rozwiązanie:

wykonaj następujące kroki:

  1. nie używaj w tagu zależności. Użyj następującego w tagu zależności w pliku 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. użyj poniższego kodu w tagu wtyczek w pliku 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>
    

Dołączam 3 słoiki z folderu lib:

w tym słoik zewnętrzny w projekcie buta wiosennego

Na koniec użyj, mvn cleana następnie mvn installlub `` mvn clean install '' i po prostu uruchom plik jar z folderu docelowego lub ścieżki instalacji (patrz mvn installdziennik):

java -jar abc.jar

uwaga: pamiętaj o jednej rzeczy, jeśli pracujesz w jenkins, najpierw użyj, mvn cleana następnie mvn clean installpolecenie działa dla ciebie, ponieważ z poprzednim kodem mvn clean installpamięci podręcznej magazynu poleceń dla zależności.

ankit
źródło