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

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

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

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

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



답변

항아리가 소스 제어의 타사 라이브러리에 있고 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가 더 나은 솔루션 입니다.

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


답변

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

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

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


답변

이것은 항아리를 설치하지 않고 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>

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


답변

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

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


답변

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

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


답변

기본적으로 이것을 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>


답변

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

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