[java] Maven 프로젝트에 로컬 jar 파일을 추가하는 방법은 무엇입니까?

프로젝트의 라이브러리 소스에 로컬 jar 파일 (아직 Maven 저장소의 일부는 아님)을 직접 추가하려면 어떻게해야합니까?



답변

다음과 같이 JAR을 로컬 Maven 저장소에 설치하십시오.

mvn install:install-file \
   -Dfile=<path-to-file> \
   -DgroupId=<group-id> \
   -DartifactId=<artifact-id> \
   -Dversion=<version> \
   -Dpackaging=<packaging> \
   -DgeneratePom=true

각각은 다음을 참조합니다.

<path-to-file>:로드 할 파일의 경로. 예 : → c:\kaptcha-2.3.jar

<group-id>: 파일을 등록해야하는 그룹 예 : → com.google.code

<artifact-id>: 파일의 이슈 이름 예 → kaptcha

<version>: 파일 버전 예 → 2.3

<packaging>: 파일 포장 예 → jar

참고


답변

다음과 같이 로컬 종속성을 직접 추가 할 수 있습니다 ( 소유권 라이브러리가 포함 된 빌드 메이븐 프로젝트에 언급 된대로 ).

<dependency>
    <groupId>com.sample</groupId>
    <artifactId>sample</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/src/main/resources/Name_Your_JAR.jar</systemPath>
</dependency>

최신 정보

새 릴리스에서는이 기능이 더 이상 사용되지 않는 것으로 표시되었지만 여전히 작동하지만 아직 제거되지 않았습니다 (maven을 시작하는 동안 로그에 경고 만 표시됨). https://issues.apache.org/jira/browse/MNG-6523 에 대해 maven 그룹에서 문제가 발생했습니다. (이 기능이 어떤 경우에 도움이되는 이유에 참여하고 설명 할 수 있음). 이 기능이 남아 있기를 바랍니다!

기능이 제거되지 않는 한 저에게 묻는다면 저장소에 맞지 않는 프로젝트의 하나의 장난 꾸러기 jar 파일 에만 의존하게 합니다. 이 기능이 제거되면 나중에 선택할 수있는 좋은 답변이 많이 있습니다!


답변

먼저 익명의 스택 오버플로 사용자 에게이 답변에 대한 크레딧을 제공하고 싶습니다. 이전에 비슷한 답변을 보았지만 이제는 찾을 수 없습니다.

로컬 JAR 파일을 종속성으로 사용하는 가장 좋은 옵션은 로컬 Maven 저장소를 작성하는 것입니다. 이러한 저장소는 pom 파일이 들어있는 올바른 디렉토리 구조에 지나지 않습니다.

내 예 : ${master_project}위치에 마스터 프로젝트가 있고 subproject1이 켜져 ${master_project}/${subproject1}있습니다.

그런 다음 Maven 저장소를 다음 위치에 만듭니다
${master_project}/local-maven-repo.

에 위치한 subproject1의 pom 파일에서 ${master_project}/${subproject1}/pom.xml파일 경로를 URL 매개 변수로 사용하는 저장소를 지정해야합니다.

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

다른 리포지토리와 마찬가지로 종속성을 지정할 수 있습니다. 이것은 pom 저장소를 독립적으로 만듭니다. 예를 들어 Maven central에서 원하는 JAR을 사용할 수 있으면 로컬 저장소에서 삭제하면 기본 저장소에서 가져옵니다.

    <dependency>
        <groupId>org.apache.felix</groupId>
        <artifactId>org.apache.felix.servicebinder</artifactId>
        <version>0.9.0-SNAPSHOT</version>
    </dependency>

마지막으로 할 일은 -DlocalRepositoryPath 스위치를 사용하여 JAR 파일을 로컬 저장소에 추가하는 것입니다.

mvn org.apache.maven.plugins:maven-install-plugin:2.5.2:install-file  \
    -Dfile=/some/path/on/my/local/filesystem/felix/servicebinder/target/org.apache.felix.servicebinder-0.9.0-SNAPSHOT.jar \
    -DgroupId=org.apache.felix -DartifactId=org.apache.felix.servicebinder \
    -Dversion=0.9.0-SNAPSHOT -Dpackaging=jar \
    -DlocalRepositoryPath=${master_project}/local-maven-repo

JAR 파일이 설치되면 Maven 저장소는 코드 저장소에 커밋 될 수 있으며 전체 설정은 시스템 독립적입니다. ( GitHub의 실례 ).

JAR을 소스 코드 저장소에 커밋하는 것이 좋은 습관은 아니지만 실제로는 게시 할 수없는 하나의 JAR을 호스팅하는 완전한 Nexus 저장소보다 빠르고 더러운 솔루션이 더 나은 경우가 있습니다.


답변

local-maven-repoMaven 프로젝트의 루트에서 새 폴더를 만듭니다 .

귀하 <project>의 내부에 로컬 저장소를 추가 하십시오 pom.xml.

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

그런 다음 설치하려는 각 외부 jar에 대해 프로젝트의 루트로 이동하여 다음을 실행하십시오.

mvn deploy:deploy-file -DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] -Durl=file:./local-maven-repo/ -DrepositoryId=local-maven-repo -DupdateReleaseInfo=true -Dfile=[FILE_PATH]


답변

그런 해결책을 원합니다 maven-install-plugin-pom 파일에서 사용 하십시오 :

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-install-plugin</artifactId>
    <version>2.5.2</version>
    <executions>
        <execution>
            <phase>initialize</phase>
            <goals>
                <goal>install-file</goal>
            </goals>
            <configuration>
                <file>lib/yourJar.jar</file>
                <groupId>com.somegroup.id</groupId>
                <artifactId>artefact-id</artifactId>
                <version>x.y.z</version>
                <packaging>jar</packaging>
            </configuration>
        </execution>
    </executions>
</plugin>

이 경우 수행 할 수 mvn initialize있으며 jar은 로컬 maven repo에 설치됩니다. 이제이 jar 은이 컴퓨터의 maven 단계에서 사용할 수 있습니다 ( <dependency></dependency>태그가 있는 pom에 다른 maven 종속성 으로이 종속성을 포함시키는 것을 잊지 마십시오 ). jar 설치를 initialize단계가 아닌 원하는 다른 단계 에 바인딩 할 수도 있습니다 .


답변

<dependency>
    <groupId>group id name</groupId>
    <artifactId>artifact name</artifactId>
    <version>version number</version>
    <scope>system</scope>
    <systemPath>jar location</systemPath>
</dependency>


답변

그렇습니다. 좋은 아이디어는 아닙니다.

대신이 항아리를 모두 maven repos에 설치하십시오.

참조