Maven : 사용자 정의 외부 JAR을 내 프로젝트에 연결하는 가장 좋은 방법은 무엇입니까?


151

Maven을 배우는 것은 처음 며칠이며 여전히 기본 사항으로 어려움을 겪고 있습니다. 내 프로젝트에서 참조 해야하는 외부 .jar 파일 (공개 저장소에서 사용할 수 없음)이 있으며 최선의 옵션이 무엇인지 파악하려고합니다.

라이브러리의 중앙 리포지토리가없는 소규모 프로젝트이므로 로컬 리포지토리 (어떻게 소스 제어에 추가되는지, 어떻게 작동 해야하는지 알지 못합니까) 또는 .jar을 저장해야합니다. 공식 저장소 외부의 디스크.

1) 프로젝트와 라이브러리가 모두 소스 제어에 있기를 원한다면 maven을 사용하여 .jar 파일을 프로젝트 참조에 추가하는 가장 좋은 방법은 무엇입니까?

2) 여전히 Eclipse가 종속성을 볼 수없는 것 같습니다. 나는 그것을 pom의 섹션에 수동으로 추가했으며 m2eclipse의 Dependencies 목록에 잘 나타납니다. mvn compile 및 mvn package 모두 성공하지만 프로그램을 실행하면 다음과 같은 결과가 발생합니다.

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
        LibraryStuff cannot be resolved to a type

이것은 POM을 다음과 같이 편집 한 후입니다.

<dependency>
  <groupId>stuff</groupId>
  <artifactId>library</artifactId>
  <version>1.0</version>
  <systemPath>${lib.location}/MyLibrary.jar</systemPath>
  <scope>system</scope>
</dependency>

mvn install : install-file을 실행해야합니까? 위와 같이 이미 pom.xml을 편집했다고 생각 했습니까?

감사!

답변:


67

mvn install:install-file로컬 저장소를 라이브러리 jar로 채우려면 시스템에서 컴파일로 범위를 변경 해야한다고 생각합니다 .

maven으로 시작하는 경우 복잡성을 추가하기 때문에 IDE 플러그인이 아닌 maven을 직접 사용하는 것이 좋습니다.

오류에 관해서는 필요한 항아리를 클래스 경로에 넣습니까? 라이브러리에서 유형을 사용하는 경우 런타임에서도 해당 유형에 액세스해야합니다. 이것은 maven 자체와 관련이 없습니다.

라이브러리를 소스 제어에 배치하려는 이유를 이해하지 못합니다. 바이너리 항아리가 아닌 소스 코드 용입니다.


36
더에 대한 mvn install::install-file: mkyong.com/maven/...
더그 T.

7
mvn install::install-file로컬 리포지토리에서 사용하면 소스 코드를 복제하는 사람도이 수동 단계를 수행해야합니다. 그렇지 않으면, 빌드는 즉시 사용되지 않습니다
Isen Ng

그래도 jar 파일을 war 파일에 추가하지 않습니다.
Prachi

207

In Project Repository를 만들 수 있으므로 run mvn install:install-file새 컴퓨터에서 작업 할 때마다 필요하지 않습니다

<repository>
    <id>in-project</id>
    <name>In Project Repo</name>
    <url>file://${project.basedir}/libs</url>
</repository>

<dependency>
    <groupId>dropbox</groupId>
    <artifactId>dropbox-sdk</artifactId>
    <version>1.3.1</version>
</dependency>

/groupId/artifactId/version/artifactId-verion.jar

세부 사항이 블로그 포스트를 읽으십시오

https://web.archive.org/web/20121026021311/charlie.cu.cc/2012/06/how-add-external-libraries-maven


2
위의 솔루션을 사용하여 "mvn clean package"를 수행하는 동안 경고가 표시되었습니다. <dependency_name> 프로젝트의 POM이 누락되었으며 사용 가능한 종속성 정보가 없습니다.
Jignesh Gohel

하나 또는 몇 개의 jar 파일을 추가 해야하는 경우에 가장 적합한 솔루션입니다. 감사.
안토니오 세 스토


2
file : // $ {project.basedir} / libs 대신 file : /// $ {project.basedir} / libs (3 개의 슬래시)를 사용해야했습니다
Loc Phan

2
설치중인 jar이 maven 컴파일 된 jar이 아닌 경우 메타 데이터를 정의하기 위해 새 pom 파일을 추가해야합니다. 이러한 수동 문제를 모두 해결 mvn install:install-file하려면 전체 디렉토리 구조를 사용하여 로컬 저장소에서 프로젝트 내 저장소로 복사하는 것이 좋습니다 .
Isen Ng

33

<dependency> 요소 안에 중첩 된 <scope> 요소를 사용하면 쉽게 달성 할 수 있습니다.

예를 들면 다음과 같습니다.

 <dependencies>
   <dependency>
     <groupId>ldapjdk</groupId>
     <artifactId>ldapjdk</artifactId>
     <scope>system</scope>
     <version>1.0</version>
     <systemPath>${basedir}\src\lib\ldapjdk.jar</systemPath>
   </dependency>
 </dependencies>

참조 : http://www.tutorialspoint.com/maven/maven_external_dependencies.htm


이 메소드는 Eclipse Embedded Maven 만 있고 설치 플러그인 (오프라인 시스템)이 부족할 때 매우 효과적이므로 install종속 프로젝트 에서 목표를 실행할 수 없습니다 . Airgapped 시스템과 설치 플러그인을 제외한 모든 플러그인을 갖는 Ofc는 매우 드문 상황입니다.
카딘 리 JH

1
가장 깨끗하고 쉬운.
Ajay Kumar

다른 폴더에서 $ {basedir} \ src \ lib \ ldapjdk.jar 경로 1 레벨을 원하는 것처럼 $ {project.basedir} 폴더 외부에있는 로컬 종속성 경로를 추가하는 방법
Naveen Kumar

오류가 발생했습니다 –"The POM for … is missing, no dependency information available” even though it exists in Maven Repository
garg10may


25

업데이트 이후 Google은 자체 Nexus 서버를 훨씬 쉽고 깔끔하게 설치했습니다.

우리 회사에는 항아리가 있었지만 공통적이지 만 어떤 maven 저장소에 호스팅되지 않았으며 로컬 저장소에 보관하지 않으려는 항아리도있었습니다. 우리는 Github에서에 매우 간단한 MVN (공공)의 repo를 만들어 (하지만 당신은 로컬 서버 나에 호스팅 할 수 있습니다) :
참고 이 몇 거의 chaning하지 jar 파일을 관리하기위한 유일한 이상적인지를

  1. GitHub에서 저장소를 만듭니다.
    https://github.com/<user_name>/mvn-repo/

  2. pom.xml에 리포지토리 추가
    (전체 경로 원시 파일은 리포지토리 이름과 약간 다름)

    <repository>
        <id>project-common</id>
        <name>Project Common</name>
        <url>https://github.com/<user_name>/mvn-repo/raw/master/</url>
    </repository>
  3. 호스트 (Github 또는 개인 서버)에
    대한 종속성 추가 여러분이 알아야 할 것은 파일이 @glitch
    /groupId/artifactId/version/artifactId-version.jar
    b에 언급 된 패턴으로 저장되어 있다는 것입니다 . 호스트에서이 패턴과 일치하는 폴더를 만듭니다.
    service-sdk-0.0.1.jar, 이름의 jar 파일이있는 경우 폴더를 작성 service-sdk/service-sdk/0.0.1/하고 jar 파일 service-sdk-0.0.1.jar을 폴더 에 넣으 십시오.
    씨. 브라우저에서 jar 파일을 다운로드하여 테스트하십시오 (이 경우 :https://github.com/<user_name>/mvn-repo/raw/master/service-sdk/service-sdk/0.0.1/service-sdk-0.0.1.jar

  4. pom.xml 파일에 대한 종속성을 추가하십시오 :

    <dependency>
        <groupId>service-sdk</groupId>
        <artifactId>service-sdk</artifactId>
        <version>0.0.1</version>
    </dependency>
  5. 즐겨


감사합니다. 제가 찾은 가장 확장 가능한 솔루션입니다.
Charlie Wu

11

systemPath를 사용하지 마십시오. 사람들이 여기에서 말한 것과 달리 체크 아웃 된 프로젝트 디렉토리 아래의 폴더에 외부 병을 넣고 Maven이 다른 종속성처럼 찾도록 할 수 있습니다. 다음은 두 가지 중요한 단계입니다.

  1. -DlocalRepositoryPath와 함께 "mvn install : install-file"을 사용하십시오.
  2. POM에서 해당 경로를 가리 키도록 저장소를 구성하십시오.

매우 간단하며 단계별 예제를 찾을 수 있습니다. http://randomizedsort.blogspot.com/2011/10/configuring-maven-to-use-local-library.html


8

Maven 프로젝트에 Maven 이외의 항아리를 추가하는 Maven 방법

메이븐 프로젝트 및 메이븐이 아닌 항아리

빌드 섹션에 maven 설치 플러그인 추가

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-install-plugin</artifactId>
        <version>${version.maven-install-plugin}</version>
        <executions>

            <execution>
                <id>install-external-non-maven1-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar1.group</groupId>
                    <artifactId>non-maven1</artifactId>
                    <version>${version.non-maven1}</version>
                    <file>${project.basedir}/libs/non-maven1.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
            <execution>
                <id>install-external-non-maven2-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar2.group</groupId>
                    <artifactId>non-maven2</artifactId>
                    <version>${version.non-maven2}</version>
                    <file>${project.basedir}/libs/non-maven2.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
            <execution>
                <id>install-external-non-maven3-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar3.group</groupId>
                    <artifactId>non-maven3</artifactId>
                    <version>${version.non-maven3}</version>
                    <file>${project.basedir}/libs/non-maven3.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

의존성 추가

<dependencies>
    <dependency>
        <groupId>jar1.group</groupId>
        <artifactId>non-maven1</artifactId>
        <version>${version.non-maven1}</version>
    </dependency>
    <dependency>
        <groupId>jar2.group</groupId>
        <artifactId>non-maven2</artifactId>
        <version>${version.non-maven2}</version>
    </dependency>
    <dependency>
        <groupId>jar3.group</groupId>
        <artifactId>non-maven3</artifactId>
        <version>${version.non-maven3}</version>
    </dependency>
</dependencies>

참고 사항 블로그의 소유자입니다


jar 버전과 maven 설치 플러그인의 버전을 어떻게 알 수 있습니까?
osk

항아리의 버전은 방금 구성되었으며, maven 설치 플러그인 버전은 최신 버전입니다.
craftsmannadeem

7

동일한 문제가 발생하고 spring-boot v1.4 +를 사용 하는 경우 이러한 방식으로 해결할 수 있습니다.

jar에 시스템 범위 종속성을 추가하는 데 사용할 수 있는 includeSystemScope 가 있습니다.

예 :

내 프로젝트에 Oracle 드라이버를 사용하고 있습니다.

<dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc14</artifactId>
        <version>10.2.0.3.0</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/src/main/resources/extra-jars/ojdbc14-10.2.0.3.0.jar</systemPath>
    </dependency>

jar를 경로 / BOOT-INF / lib / **에 포함 시키려면 includeSystemScope = true로 설정하십시오.

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

중복 포함을 피하기 위해 자원에서 제외하십시오.

<build>
    <testSourceDirectory>src/test/java</testSourceDirectory>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <excludes>
                <exclude>**/*.jar</exclude>
            </excludes>
        </resource>
    </resources>
</build>

행운을 빕니다!


나는 새로운 개발자가 도착하면 설치 절차를 단순화하기 때문에 이와 같은 솔루션을 찾고있었습니다. 인공물 서버가없는 경우 프로젝트에서 사용자 지정 종속성을 갖는 것이 더 쉽습니다. 또한 CI를 사용할 때이 솔루션은 CI 서버에 jar을 수동으로 설치하지 마십시오.
Dalc

여러 항아리는 어떻습니까?
mithun_ghose

4

systemPath를 변경하십시오 .

<dependency>
  <groupId>stuff</groupId>
  <artifactId>library</artifactId>
  <version>1.0</version>
  <systemPath>${project.basedir}/MyLibrary.jar</systemPath>
  <scope>system</scope>
</dependency>

3

pom.xml은 로컬 저장소를보고 아티팩트와 일치하는 종속성을 찾으려고합니다. 또한 실제로 시스템 범위 또는 systemPath 속성을 사용하지 않아야합니다. 일반적으로 JRE가 아닌 JDK에있는 항목을 위해 예약되어 있습니다.

메이븐 아티팩트를 설치하는 방법에 대해서는이 질문 을 참조하십시오 .


3

사용하는 모든 예제는

<repository>...</respository> 

외부가 필요하다

<repositories>...</repositories> 

묶는 태그. 일부 예에서는 명확하지 않습니다.


2

가장 좋은 해결책은 저장소 또는 Nexus 또는 Artifactory를 설치하는 것입니다. 만약 당신에게 이런 것들을 넣을 수있는 장소를 제공한다면, 외부에서 물건을 캐싱하여 물건의 속도를 높입니다.

다루고있는 것이 오픈 소스라면 중앙에 배치 하는 것도 고려할 수 있습니다 .

가이드를 참조하십시오 .


1

Eclipse Oxygen을 사용하면 다음 작업을 수행 할 수 있습니다.

  1. WEB-INF / lib에 라이브러리를 배치하십시오.
  2. 프로젝트-> 빌드 경로 구성-> 라이브러리 추가-> 웹 앱 라이브러리

Maven은 프로젝트를 설치할 때 가져옵니다.


3
그렇다면 프로젝트를 가져 오는 다른 사용자가 Eclipse에서 동일한 작업을 수행해야합니까?
cruxi

0

외부 jar이 Maven 프로젝트에서만 작성되는 경우 시스템에서 전체 프로젝트를 복사하고

mvn install

프로젝트 디렉토리에. 이것은 jar를 로컬 maven 저장소 인 .m2 디렉토리에 추가합니다.

이제 추가 할 수 있습니다

<dependency>
     <groupId>copy-from-the=maven-pom-of-existing-project</groupId>
     <artifactId>copy-from-the=maven-pom-of-existing-project</artifactId>
     <version>copy-from-the=maven-pom-of-existing-project</version>
</dependency>

이것은 당신을 보장합니다

mvn exec:java 

공장. 당신이 여기에 제안 을 사용하는 경우

<scope>system</scope>

그런 다음 명령 줄을 통해 실행하는 동안 클래스를 개별적으로 추가해야합니다.

여기에 설명 된 다음 명령으로 외부 jar을 추가 할 수 있습니다.

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

0

이 문제를 해결하는 가장 효과적이고 깨끗한 방법은 Github 패키지를 사용하는 것입니다.

  1. 외부 jar을 공개적으로 호스팅할지 여부에 대한 요구 사항에 따라 GitHub에 간단한 빈 공용 / 개인 저장소를 만듭니다.

  2. maven 명령을 실행하여 위에서 만든 github 저장소에 외부 jar을 배포하십시오.

    mvn deploy:deploy-file \ -DgroupId= your-group-id \ -DartifactId= your-artifact-id \ -Dversion= 1.0.0 -Dpackaging= jar -Dfile= path-to-file \ -DrepositoryId= id-to-map-on-server-section-of-settings.xml \ -Durl=https://maven.pkg.github.com/github-username/github-reponame-created-in-above-step

    위의 명령은에 언급 ​​된 GitHub 저장소에 외부 jar을 배포합니다 -Durl=. 종속성을 GitHub 패키지로 배포하는 방법에 대한이 링크를 참조 할 수 있습니다. GitHub 패키지 배포 자습서

  3. 그 후 당신이 사용 종속성을 추가 할 수 있습니다 groupId, artifactId그리고 version받는다는에서 위의 단계에서 언급 pom.xml하고 실행mvn install

  4. Maven은 GitHub Packages 레지스트리에서 외부 jar의 종속성을 가져와 maven 프로젝트에서 제공합니다.

  5. 이것이 작동하려면 settings.xmlGitHub 패키지 레지스트리에서 가져 오도록 maven을 구성해야합니다 .

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