메이븐 : 상대 경로로 항아리에 종속성 추가


232

의존성으로 내 pom에 추가하려는 독점적 인 항아리가 있습니다.

그러나 나는 그것을 저장소에 추가하고 싶지 않습니다. 그 이유는 mvn compile, 등의 일반적인 maven 명령 이 즉시 작동하기를 원하기 때문입니다. (개발자에게 요구하지 않고 자체 저장소에 추가해야 함).

항아리가 소스 제어의 타사 라이브러리에 있고 pom.xml 파일의 상대 경로로 링크되도록하고 싶습니다.

이것을 할 수 있습니까? 어떻게?

답변:


343

항아리가 소스 제어의 타사 라이브러리에 있고 pom.xml 파일의 상대 경로로 링크되도록하고 싶습니다.

정말로 이것을 원한다면 (기업 저장소를 사용할 수 없다면 이해하십시오), 내 조언은 프로젝트의 로컬 "파일 저장소"를 사용 하고 system범위 가 지정된 종속성을 사용하지 않는 것 입니다. 그만큼system스코프 (예 : 어셈블리)와 같은 의존성이 많은 상황에서 잘 작동하지 않는 피해야한다, 그들은 혜택보다 더 많은 문제를 야기한다.

대신 프로젝트에 로컬 리포지토리를 선언하십시오.

<repositories>
  <repository>
    <id>my-local-repo</id>
    <url>file://${project.basedir}/my-repo</url>
  </repository>
</repositories>

거기에 사용에서 타사 lib 디렉토리를 설치 install:install-filelocalRepositoryPath매개 변수 :

mvn install:install-file -Dfile=<path-to-file> -DgroupId=<myGroup> \ 
                         -DartifactId=<myArtifactId> -Dversion=<myVersion> \
                         -Dpackaging=<myPackaging> -DlocalRepositoryPath=<path>

업데이트 : 플러그인 버전 2.2를 사용할 때 install:install-file무시하는 것으로 보입니다 localRepositoryPath. 그러나 플러그인 2.3 버전 이상에서 작동합니다. 플러그인의 완전한 이름을 사용하여 버전을 지정하십시오.

mvn org.apache.maven.plugins:maven-install-plugin:2.3.1:install-file \
                         -Dfile=<path-to-file> -DgroupId=<myGroup> \ 
                         -DartifactId=<myArtifactId> -Dversion=<myVersion> \
                         -Dpackaging=<myPackaging> -DlocalRepositoryPath=<path>

maven-install-plugin 문서

마지막으로 다른 의존성처럼 선언하십시오 (그러나 system범위가 없음).

<dependency>
  <groupId>your.group.id</groupId>
  <artifactId>3rdparty</artifactId>
  <version>X.Y.Z</version>
</dependency>

이것은 system의존성이 좋은 시민처럼 취급 될 것이므로 (예를 들어, 어셈블리에 포함 되는 등) 범위를 사용하는 것보다 IMHO가 더 나은 솔루션 입니다.

이제는 회사 환경에서이 상황을 처리하는 "올바른 방법"(여기서는 아닐 수도 있음)에 회사 저장소를 사용하는 것입니다.


2
이것은 좋은 생각이지만 Maven 2.2.1에서 설치 플러그인은 무시하는 것 같습니다 localRepositoryPath.
Jake

1
지역 저장소를 선언해야하는 이유 왜 나머지와 함께 ~ / .m2 /로 들어 가지 않겠습니까?
Leif Gruenwoldt

6
@ leif81 리포지토리와 라이브러리가 SCM 리포지토리에 체크인되므로 소스 체크 아웃을 수행하는 사람은 라이브러리 / 애플리케이션의 사본을 빌드하는 데 필요한 모든 것을 갖습니다.
다스 안드로이드

6
@lemon과 동일한 문제가 있었지만 대신 basedir/./my-local-repo단일 로 수행 하여 수정했습니다 ..
Brian

2
포장은 단지 병이어야하므로 -Dpackaging = jar
Danila Piatov

127

system범위 사용 ${basedir}pom의 디렉토리입니다.

<dependency>
    <artifactId>..</artifactId>
    <groupId>..</groupId>
    <scope>system</scope>
    <systemPath>${basedir}/lib/dependency.jar</systemPath>
</dependency>

그러나 jar를 저장소에 설치하고 SCM에 커밋하지 않는 것이 좋습니다. 결국 Maven이 제거하려고 시도한 것입니다.


15
범위 시스템은 가능한 모든 곳에서 피해야합니다. 저장소에 JAR을 설치하는 것이 더 나은 솔루션입니다.
Gandalf StormCrow

14
가능하다면 가능합니다. 그는 저장소에 저장하고 싶지 않다고 명시 적으로 말했다. 이 방법이 좋지 않다는 의견을 추가했습니다. 그러나 작동합니다.
Bozho

그루비, 당신이 솔루션은 내가 완전히 질문을 오해 ... 지금까지 내가 추측 가장 수용
개미

예-질문 자체에 최상의 답변이 제외됩니다. 단일 소스 제어 서버에 모든 것을 넣는 것은 "기본적으로 구축"과 관련이 없습니다. 오히려 모든 것이 "제어"되어야합니다. 체크인 pom 's & settings.xml ( 내부 저장소를 가리킴)을 수행하고 프로젝트에 (1) 소스 제어, (2) 생성 된 아티팩트 제어의 서버를 사용하십시오. 그것은 dll의 체크인과 마찬가지로 항아리를 체크인하는 것이 의미가 있습니다 (내 오래된 회사는 실제로 체크인 항아리 & lib.a / .so / .dll을 수행했습니다. 우리의 p4 서버는 너무 느려서 일부는 비밀리에 하루 동안 hg를 사용했습니다 일상적인 일 문제가 해결 되었습니까?
michael

항아리를 포함하는 디렉토리를 지정하는 방법은 그래들처럼 gradle처럼 각각을 추가하지 않아도됩니까?
Dean Hiller

29

이것은 항아리를 설치하지 않고 maven 2 빌드 클래스 경로에 항아리를 추가 할 수 있습니까? 에 대한 이전 답변 외에도 다른 방법입니다 .

다중 모듈 빌드를 사용할 때 특히 다운로드 된 JAR이 상위 외부의 하위 프로젝트에서 참조되는 경우 한계를 극복합니다. 또한 빌드의 일부로 POM 및 SHA1 파일을 작성하여 설정 작업을 줄입니다. 또한 파일을 이름을 수정하거나 maven 저장소 구조를 따르지 않고 프로젝트의 어느 곳에 나 위치시킬 수 있습니다.

이것은 maven-install-plugin을 사용합니다. 이 작업을 수행하려면 다중 모듈 프로젝트를 설정하고 로컬 저장소에 파일을 설치하고 첫 번째 파일이되도록 빌드를 나타내는 새 프로젝트가 있어야합니다.

다중 모듈 프로젝트 pom.xml은 다음과 같습니다.

<packaging>pom</packaging>
<modules>
<!-- The repository module must be first in order to ensure
     that the local repository is populated -->
    <module>repository</module>
    <module>... other modules ...</module>
</modules>

그러면 repository / pom.xml 파일에 프로젝트의 일부인 JAR을로드하기위한 정의가 포함됩니다. 다음은 pom.xml 파일의 일부입니다.

<artifactId>repository</artifactId>
<packaging>pom</packaging>

pom 패키징은 이것이 테스트를 수행하거나 jar 파일을 컴파일하거나 생성하는 것을 방지합니다. pom.xml의 핵심은 maven-install-plugin이 사용되는 빌드 섹션에 있습니다.

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <executions>
                <execution>
                        <id>com.ibm.db2:db2jcc</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>install-file</goal>
                        </goals>
                        <configuration>
                            <groupId>com.ibm.db2</groupId>
                            <artifactId>db2jcc</artifactId>
                            <version>9.0.0</version>
                            <packaging>jar</packaging>
                            <file>${basedir}/src/jars/db2jcc.jar</file>
                            <createChecksum>true</createChecksum>
                            <generatePom>true</generatePom>
                        </configuration>
                </execution>
                <execution>...</execution>
            </executions>
        </plugin>
    </plugins>
</build>

둘 이상의 파일을 설치하려면 실행을 더 추가하십시오.


이것이 내 멀티 모듈 프로젝트에서 효과가 있었던 유일한 것입니다. 알 수없는 이유로 로컬 <repository> 접근 방식이 작동하지 않았습니다. 감사합니다!
Lonzak

10

이것은 나를 위해 일하고 있습니다 :이 의존성이 있다고 가정 해 봅시다.

<dependency>
    <groupId>com.company.app</groupId>
    <artifactId>my-library</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/my-library.jar</systemPath>
</dependency>

그런 다음 시스템 종속성에 대한 클래스 경로를 수동으로 다음과 같이 추가하십시오.

<Class-Path>libs/my-library-1.0.jar</Class-Path>

전체 구성 :

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <archive>
            <manifestEntries>
                <Build-Jdk>${jdk.version}</Build-Jdk>
                <Implementation-Title>${project.name}</Implementation-Title>
                <Implementation-Version>${project.version}</Implementation-Version>
                <Specification-Title>${project.name} Library</Specification-Title>
                <Specification-Version>${project.version}</Specification-Version>
                <Class-Path>libs/my-library-1.0.jar</Class-Path>
            </manifestEntries>
            <manifest>
                <addClasspath>true</addClasspath>
                <mainClass>com.company.app.MainClass</mainClass>
                <classpathPrefix>libs/</classpathPrefix>
            </manifest>
        </archive>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.5.1</version>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/libs/</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

9

나는 이것을하기 위한 패턴대해 이전에 썼다 .

파스칼이 제안한 솔루션과 매우 유사하지만, 모든 의존성을 전용 리포지토리 모듈로 옮기므로 멀티 모듈 빌드 인 경우 종속성이 사용되는 모든 곳에서 반복 할 필요가 없습니다.


6

기본적으로 이것을 pom.xml에 추가하십시오.

...

<repositories>
   <repository>
       <id>lib_id</id>
       <url>file://${project.basedir}/lib</url>
   </repository>
</repositories>

...

<dependencies>
  ...
  <dependency>
      <groupId>com.mylibrary</groupId>
      <artifactId>mylibraryname</artifactId>
      <version>1.0.0</version>
  </dependency>
  ...
</dependencies>

4

우리는 gradle로 전환했고 이것은 gradle에서 훨씬 잘 작동합니다.). 우리는 단지 그러한 상황에서 항아리를 놓을 수있는 폴더를 지정합니다. 우리는 여전히 대부분의 항아리를 전형적인 의존성 관리 섹션 (즉, maven과 동일)으로 정의했습니다. 이것은 우리가 정의한 또 하나의 의존성입니다.

그래서 기본적으로 우리는 maven 저장소에없는 경우 임시 테스트를 위해 lib dir에 원하는 항아리를 놓을 수 있습니다.


1
어떻게했는지 예를 들어 주시겠습니까?
토마스

2

Pascal이 게시 한 솔루션에 하나의 작은 추가

이 경로를 따를 때 ojdbc jar를 설치하는 동안 maven에서 오류가 발생했습니다.

[INFO] --- maven-install-plugin:2.5.1:install-file (default-cli) @ validator ---
[INFO] pom.xml not found in ojdbc14.jar

-DpomFile을 추가 한 후 문제가 해결되었습니다.

$ mvn install:install-file -Dfile=./lib/ojdbc14.jar -DgroupId=ojdbc \
   -DartifactId=ojdbc -Dversion=14 -Dpackaging=jar -DlocalRepositoryPath=./repo \
   -DpomFile=~/.m2/repository/ojdbc/ojdbc/14/ojdbc-14.pom

0

Eclipse를 사용하여 실행 가능한 Jar를 생성 할 수 있습니다. 내보내기 / 실행 가능한 Jar 파일


그 질문에 대한 대답인지 확실하지 않습니다. 그는 파일을 이미 항아리로 가지고 있습니다.
Johannes Jander

Eclipse는 uberjar 또는 음영 처리 된 jar를 지원하므로 솔루션은 있지만 maven에는 적합하지 않음
Alex Lehmann
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.