Maven und Hinzufügen von JARs zum Systemumfang

86

Ich habe eine JAR in meinem Android-Projekt und möchte, dass sie zur endgültigen APK hinzugefügt wird. Okay, hier bin ich:

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

Aber wenn ich renne, bekomme mvn packageich eine Warnung:

[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

Und in der letzten APK gibt es keine JARs.

Wie behebe ich das?

efpies
quelle
3
Sie können den Systembereich auf diese Weise nicht verwenden. benutze install: install-file.
Bmargulies
@bmargulies Kannst du sagen, wofür dieser Spielraum ist?
Efpies
1
Ich bin zu Gradle gewechselt und habe diese Kopfschmerzen nicht mehr, außer jetzt versuche ich, eine Open-Source-Bibliothek mit Maven zu verwenden und vorübergehend ein Glas zu hacken (was in Gradle so einfach und in Maven so schwer ist).
Dean Hiller
1
Diese Frage hat Diskussion darüber, wie man die Verwendung des Systembereichs in Maven vermeidet: stackoverflow.com/questions/3642023/…
Mark Butler
Offizielle Dokumentation zum Anwendungsbereich 'System': maven.apache.org/guides/introduction/…
Guillaume Husta

Antworten:

24

Sie müssen das Glas zu Ihrem lokalen Maven-Repository hinzufügen. Alternativ (bessere Option) geben Sie das richtige Repository an (falls vorhanden), damit es automatisch von maven heruntergeladen werden kann

Entfernen Sie in beiden Fällen das <systemPath>Tag aus der Abhängigkeit

Attila
quelle
4
Ich habe diesen Artikel gesehen, aber ich hatte gehofft, ihn nicht maven installauf jedem Computer zu machen, auf dem ich dieses Projekt erstellen möchte (leider habe ich diese JAR nicht in Repos gefunden). Vielen Dank! :)
efpies
1
Es kann als Teil des Builds geschrieben werden.
Thorbjørn Ravn Andersen
140

Ich kenne den wahren Grund nicht, aber Maven drängt Entwickler, alle Bibliotheken (auch benutzerdefinierte) in einigen Maven-Repositorys zu installieren. Dies scope:systemist nicht sehr beliebt. Eine einfache Problemumgehung ist die Verwendungmaven-install-plugin

Folgen Sie der Verwendung:

Schreiben Sie Ihre Abhängigkeit auf diese Weise

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

Fügen Sie dann das Maven-Install-Plugin hinzu

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

achten Sie auf phase:clean, Ihre benutzerdefinierte Bibliothek in Ihrem Repository zu installieren, müssen Sie laufen mvn cleanund dannmvn install

Ging3r
quelle
10
Warum nicht <phase>process-resources</phase>anstelle von verwenden <phase>clean</phase>. Die Prozessressourcenphase scheint für ein solches Szenario besser geeignet zu sein und wird immer vor der Kompilierungsphase aufgerufen.
Jplandrain
1
Sind Sie sicher, dass Sie in einer ersten Installation die Validierungsphase bestehen können, die vor den Prozessressourcen im "erstellten Lebenszyklus" liegt? ;; ), 'sauberer Lebenszyklus' steht an erster Stelle 'gebauter Lebenszyklus' und es gibt keine Abhängigkeiten von irgendeiner Validierung, tutorialspoint.com/maven/maven_build_life_cycle.htm
Ging3r
5
Es funktioniert, aber wie installieren Sie mehrere Abhängigkeiten?
Renaud Pawlak
4
Stackoverflow sollte eine Funktion hinzufügen, die es der Community ermöglicht, die Wahl der richtigen Antwort durch OP zu überschreiben, da IMHO diese Antwort die akzeptierte sein sollte! :)
Vijay Chavda
2
Wie andere kommentiert haben, ist die Bindung an die cleanPhase sehr irreführend, sie ist nicht Teil des Standardlebenszyklus und verzerrt die Bedeutung von clean. Darüber hinaus schlägt die vorgeschlagene Änderung zur Verwendung einer Phase im Standardlebenszyklus (z. B. validateoder process-resources) in einer Situation mit mehreren Modulen fehl, da der Aggregator versucht, Abhängigkeiten aufzulösen, bevor benutzerdefinierte Ziele für untergeordnete Module ausgeführt werden.
Wool.in.Silver
13
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

Versuche dies.

user9064925
quelle
11

Der Systemumfang wurde nur für den Umgang mit Systemdateien entwickelt. Dateien an einem festen Ort. Dateien in /usr/liboder ${java.home}(z tools.jar. B. ). Es wurde nicht entwickelt, um verschiedene .jarDateien in Ihrem Projekt zu unterstützen.

Die Autoren haben sich absichtlich geweigert, die Pfadnamenerweiterungen so zu gestalten, dass Sie entmutigt werden. Kurzfristig können Sie daher install:install-filedas lokale Repo installieren und eines Tages einen Repo-Manager zum Teilen verwenden.

bmargulies
quelle
3

Verwenden Sie einen Repository-Manager und installieren Sie diese Art von Gläsern. Das löst Ihre Probleme überhaupt und für alle Computer in Ihrem Netzwerk.

khmarbaise
quelle
3
Wir wollten morgen oder nach morgen ein Repo auf dem lokalen Server ausführen, aber vorher sollte ich dieses Problem auf andere Weise lösen.
Efpies
1
Wie @efpies bereits erwähnt hat, kann dies eine "Pie-in-the-Sky" -Antwort sein, wenn ein Entwickler nicht über die Berechtigung / Fähigkeit verfügt, einen Repo-Manager zu erstellen.
Javadba
Wenn Sie heutzutage Docker installiert haben, brauchen Sie nur noch docker run -d -p 8081:8081 --name nexus sonatype/nexus3- siehe hub.docker.com/r/sonatype/nexus3 für Details.
Thorbjørn Ravn Andersen
3

Versuchen Sie diese Konfiguration. Es hat bei mir funktioniert:

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

Installieren Sie das JAR im lokalen Repository.

luftig
quelle
3
Dies ist umständlich, als direkt durch den Pom hinzuzufügen.
Pradeeban Kathiravelu
0

Dank Ging3r habe ich eine Lösung bekommen:

folge diesen Schritten:

  1. Nicht im Abhängigkeitstag verwenden. Verwenden Sie das folgende in Abhängigkeiten-Tag in der Datei 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. Verwenden Sie den folgenden Code im Plugins-Tag in der Datei 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>

Ich füge 3 Gläser aus dem lib-Ordner hinzu:

einschließlich externes Glas im Frühjahr Boot-Projekt

Verwenden Sie zum Schluss mvn cleanund dann mvn installoder 'mvn clean install' und führen Sie einfach die JAR-Datei aus dem Zielordner oder dem Installationspfad aus (siehe mvn installProtokoll):

java -jar abc.jar

Hinweis: Denken Sie an eine Sache, wenn Sie bei Jenkins arbeiten, dann verwenden Sie zuerst mvn cleanund dann mvn clean installBefehlsarbeit für Sie, da mit dem vorherigen Code mvn clean installBefehl Cache für Abhängigkeit speichern.

Ankit
quelle