의존성으로 내 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-file
과 localRepositoryPath
매개 변수 :
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>
마지막으로 다른 의존성처럼 선언하십시오 (그러나 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에 원하는 항아리를 놓을 수 있습니다.