Maven 및 시스템 범위에 JAR 추가


86

Android 프로젝트에 JAR이 있으며 최종 APK에 추가되기를 원합니다. 좋아, 여기 간다.

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

하지만 실행 mvn package중에는 경고가 표시됩니다.

[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

그리고 최종 APK에는 JAR이 없습니다.

어떻게 수정합니까?


3
이런 식으로 시스템 범위를 사용할 수 없습니다. install : install-file을 사용하십시오.
bmargulies

@bmargulies이 범위가 무엇인지 말할 수 있습니까?
efpies

1
나는 gradle로 전환했고 이제는 maven과 함께 오픈 소스 라이브러리를 사용하고 일시적으로 jar를 해킹하려고하는 것을 제외하고는 더 이상 이러한 두통이 없습니다 (이것은 gradle에서 너무 쉽고 maven에서 너무 어렵습니다).
Dean Hiller 2013 년

1
이 질문에는 Maven에서 시스템 범위 사용을 피하는 방법에 대한 논의가 있습니다. stackoverflow.com/questions/3642023/…
Mark Butler

범위 '시스템'에 대한 공식 문서 : maven.apache.org/guides/introduction/…
Guillaume Husta

답변:


24

jar 를 로컬 Maven 저장소 에 추가 해야 합니다. 또는 (더 나은 옵션) 적절한 저장소 (있는 경우)를 지정하여 maven에서 자동으로 다운로드 할 수 있습니다.

두 경우 모두 <systemPath>종속성 에서 태그를 제거하십시오.


4
나는 그 기사를 보았지만 maven install해당 프로젝트를 빌드하려는 모든 컴퓨터에서 수행하지 않기를 바랐습니다 (불행히도이 JAR을 repos에서 찾지 못했습니다). 감사! :)
efpies efpies 2012-06-07

1
빌드의 일부로 스크립팅 할 수 있습니다.
Thorbjørn Ravn Andersen

145

진짜 이유는 모르지만 Maven은 개발자에게 모든 라이브러리 (사용자 정의)를 일부 maven 저장소에 설치하도록 촉구하므로 scope:system좋아하지 않습니다. 간단한 해결 방법은 사용하는 것입니다.maven-install-plugin

사용법을 따르십시오 :

이런 식으로 의존성을 작성하십시오.

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

그런 다음 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:clean사용자 정의 라이브러리를 저장소에 설치하려면 mvn clean다음 을 실행해야합니다.mvn install


10
왜 사용하지 <phase>process-resources</phase>대신 <phase>clean</phase>. 프로세스 리소스 단계는 이러한 시나리오에 더 적합 해 보이며 항상 컴파일 단계 전에 호출됩니다.
jplandrain

1
첫 번째 설치에서 '빌드 된 라이프 사이클'에서 프로세스 리소스보다 먼저 발생하는 '검증'단계를 통과 할 수 있습니까? ; ), '깨끗한 수명주기'가 먼저 '빌드 된 수명주기'로
나오며

5
작동하지만 여러 종속성을 어떻게 설치합니까?
Renaud Pawlak

6
Stackoverflow는 커뮤니티가 OP의 정답 선택을 재정의 할 수있는 기능을 추가해야합니다. IMHO,이 답변이 허용되어야하기 때문입니다! :)
Vijay Chavda

2
다른 사람들이 언급했듯이 clean단계에 대한 바인딩 은 매우 오해의 소지가 있으며 기본 수명주기의 일부가 아니며의 의미를 왜곡합니다 clean. 또한 기본 수명주기 (예 : validate또는 process-resources) 에서 단계를 사용하도록 제안 된 변경 사항 은 하위 모듈에 대해 실행되는 사용자 지정 목표에 앞서 집계자가 종속성 해결을 시도하기 때문에 다중 모듈 상황에서 실패 합니다.
wool.in.silver

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

이 시도.


11

시스템 범위는 '시스템'파일 만 처리하도록 설계되었습니다. 고정 된 위치에있는 파일. /usr/lib, 또는 ${java.home}(예 :)의 파일 tools.jar. .jar프로젝트의 기타 파일 을 지원하도록 설계되지 않았습니다 .

저자는 의도적으로 경로 이름 확장이 제대로 작동하지 않도록 거부했습니다. 결과적으로 단기적 install:install-file으로는 로컬 리포지토리에 설치 하는 데 사용할 수 있으며 언젠가는 리포지토리 관리자를 사용하여 공유 할 수 있습니다.


3

저장소 관리자를 사용하여 이런 종류의 jar를 설치하십시오. 그러면 네트워크의 모든 컴퓨터에 대한 문제가 해결됩니다.


3
내일 또는 내일 이후에 로컬 서버에서 리포지토리를 실행할 계획 이었지만 그 전에는 다른 방법으로이 문제를 해결해야합니다.
efpies

1
@efpies가 언급했듯이 이것은 개발자가 repo 관리자를 생성 할 수있는 권한 / 능력이 없을 때 가장 큰 대답 일 수 있습니다.
StephenBoesch

당신이 경우 요즘은 고정 표시기는 당신이 필요로하는 모든이 설치 docker run -d -p 8081:8081 --name nexus sonatype/nexus3참조 - hub.docker.com/r/sonatype/nexus3을 자세한 내용은.
Thorbjørn Ravn Andersen

3

이 구성을 시도하십시오. 그것은 나를 위해 일했습니다.

<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

jar를 로컬 저장소에 설치하십시오.


3
이것은 pom을 직접 추가하는 것보다 번거 롭습니다.
Pradeeban Kathiravelu 2016 년

0

Ging3r 덕분에 솔루션이 생겼습니다.

이 단계를 따르세요:

  1. 종속성 태그에는 사용하지 마십시오. 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. pom.xml 파일의 plugins 태그에서 다음 코드를 사용하십시오.

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

lib 폴더에서 3 개의 항아리를 포함하고 있습니다.

스프링 부트 프로젝트에 외부 항아리 포함

마지막으로, 사용 mvn cleanmvn install또는 'MVN 클린 설치'및 대상 폴더 나 (참조 설치 경로에서 바로 실행 jar 파일 mvn install로그) :

java -jar abc.jar

참고 : 젠킨스에서 일하는 경우 한 가지를 기억하십시오. 이전 코드 명령은 종속성에 대한 캐시를 저장 하기 때문에 먼저 사용 mvn clean하고 mvn clean install명령이 작동합니다 mvn clean install.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.