jar를 설치하지 않고 maven 2 빌드 클래스 경로에 항아리를 추가 할 수 있습니까?


700

Maven2는 실험 / 빠르고 더러운 모형 개발 단계에서 나를 미치게합니다.

pom.xml사용하려는 웹 응용 프로그램 프레임 워크의 종속성을 정의 하는 파일이 있으며 해당 파일에서 시작 프로젝트를 빠르게 생성 할 수 있습니다. 그러나, 때로는 이미이없는 제 3 자 라이브러리에 연결할 pom.xml정의 파일을, 그래서보다는 만드는 pom.xml손으로 제 3 자 lib 디렉토리의 파일 및 설치, 내에 종속성을 추가 pom.xml, 난 그냥 싶습니다 Maven에게 "내가 정의한 의존성뿐만 아니라 안에있는 항아리도 포함 시켜라 /lib."

이것은 간단 해야하는 것처럼 보이지만 그렇다면 뭔가 빠진 것입니다.

이 작업을 수행하는 방법에 대한 조언은 대단히 감사합니다. 짧게 말하면 maven을 /lib디렉토리 로 가리키고 pom.xml하나의 의존성에 매핑 된 모든 jar 파일을 쉽게 만들 수 있는 간단한 방법이 있다면 이름 / 설치 및 한 번의 링크로 연결할 수 있습니다.


Netbeans를 사용하는 경우 다음 단계를 따르십시오. [Netbeans 내장 Maven을 사용하여 maven 저장소에 모듈을 어떻게 설치합니까?] [1] [1] : stackoverflow.com/a/339874/530153
Rajat Gupta

1
이 링크 stackoverflow.com/a/339874/530153 이 항아리를 한 번에 하나씩 설치하는 데 작동하는 것으로 보입니다.
Paul

답변:


600

대중적인 접근 방식의 문제

인터넷에서 찾을 수있는 대부분의 답변은 로컬 저장소에 종속성을 설치하거나 "시스템"범위를 지정하고 pom프로젝트 소스와의 종속성을 분배하도록 제안합니다 . 그러나이 두 솔루션 모두 실제로 결함이 있습니다.

"로컬 저장소에 설치"접근 방식을 적용하지 않아야하는 이유

로컬 리포지토리에 대한 종속성을 설치해도 그대로 유지됩니다. 이 아티팩트에 액세스 할 수 있으면 배포 아티팩트가 제대로 작동합니다. 문제는 대부분이 리포지토리가 로컬 컴퓨터에 상주하므로 다른 컴퓨터에서이 종속성을 해결할 수있는 방법이 없다는 것입니다. 아티팩트를 특정 머신에 의존하게 만드는 것은 처리 방법이 아닙니다. 그렇지 않으면이 종속성은 해당 프로젝트로 작업하는 모든 컴퓨터에 로컬로 설치해야하며 이는 나아지지 않습니다.

"시스템 범위"접근 방식을 적용하지 않아야하는 이유

"시스템 범위"접근 방식에 의존하는 jar는 저장소에 설치되거나 대상 패키지에 연결되지 않습니다. 그렇기 때문에 배포 패키지가 사용될 때 이러한 종속성을 해결할 수있는 방법이 없습니다. 시스템 범위 사용이 더 이상 사용되지 않는 이유라고 생각합니다. 어쨌든 더 이상 사용되지 않는 기능에 의존하고 싶지 않습니다.

정적 프로젝트 내 저장소 솔루션

이것을 당신의 pom다음에 넣은 후 :

<repository>
    <id>repo</id>
    <releases>
        <enabled>true</enabled>
        <checksumPolicy>ignore</checksumPolicy>
    </releases>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <url>file://${project.basedir}/repo</url>
</repository>

x.y.zMaven 형식의 그룹 ID를 가진 각 아티팩트에 대해 아티팩트 검색시 프로젝트 디렉토리 내에 다음 위치가 포함됩니다.

repo/
| - x/
|   | - y/
|   |   | - z/
|   |   |   | - ${artifactId}/
|   |   |   |   | - ${version}/
|   |   |   |   |   | - ${artifactId}-${version}.jar

이에 대한 자세한 내용은 이 블로그 게시물을 참조하십시오 .

Maven을 사용하여 프로젝트 저장소에 설치

이 구조를 직접 작성하는 대신 Maven 플러그인을 사용하여 항아리를 아티팩트로 설치하는 것이 좋습니다. 따라서 repo폴더 아래의 프로젝트 저장소에 아티팩트를 설치 하려면 다음을 실행하십시오.

mvn install:install-file -DlocalRepositoryPath=repo -DcreateChecksum=true -Dpackaging=jar -Dfile=[your-jar] -DgroupId=[...] -DartifactId=[...] -Dversion=[...]

이 방법을 선택하면 다음과 같이 저장소 선언을 단순화 할 수 있습니다 pom.

<repository>
    <id>repo</id>
    <url>file://${project.basedir}/repo</url>
</repository>

도우미 스크립트

각 lib에 대한 설치 명령을 실행하는 것은 다소 성 가시고 오류가 발생하기 쉽기 때문에 폴더에서 프로젝트 저장소로 모든 jar를 자동으로 설치 하는 유틸리티 스크립트 를 작성 lib하고 모든 메타 데이터 (groupId, artifactId 등)를 자동으로 해결했습니다. 파일 이름. 이 스크립트는 또한에 복사하여 붙여 넣을 수 있도록 종속성 xml을 인쇄합니다 pom.

대상 패키지에 종속성 포함

프로젝트 내 저장소를 만들면 소스와 함께 프로젝트의 종속성을 배포하는 문제가 해결되었지만 프로젝트의 대상 아티팩트는 게시되지 않은 jar에 의존하므로 설치할 때 그것은 저장소에 그것은 해결할 수없는 의존성을 가질 것입니다.

이 문제를 해결하려면 대상 패키지에 이러한 종속성을 포함시키는 것이 좋습니다. 이것은 어셈블리 플러그인 또는 OneJar 플러그인으로 더 잘 할 수 있습니다 . OneJar의 공식 문서는 이해하기 쉽습니다.


3
나는 항상 프로젝트에서 저장소를 만들 수 있다고 가정하고 마침내 확인했습니다.
albfan

19
1) Windows에서 RFC 호환 URL을 얻으려면 "file : // $ {project.basedir} / repo"대신 "$ {project.baseUri} repo"를 사용하는 것이 좋습니다. 2) 프로젝트를 하위 모듈로 구성하면 $ {project.baseUri}가 모듈의 하위 디렉토리로 해석되므로이 방법이 실패한 것 같습니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까?
Oliver Hanappi

8
이것은 거의 나를 거기에 데려 갔지만 Nikita의 스크립트는 내가 가지고있는 잘못 명명 된 JAR 파일로 너무 영리하려고했습니다. 그래서 나는 groupId에 대해 추측하지 않는 간단한 버전을 만들었습니다 : github.com/carchrae/install-to-project-repo
Tom Carchrae

3
그런 훌륭한 답변 !! 무언가를하는 두 가지 방법, 올바른 방법과 작동하는 방식이 있습니다. 여러분은 올바른 방법으로 행동합니다!
판 트로

1
여기에서 jar 파일에서 아티팩트를 자동으로 생성하는 방법에 대한 정보도 찾을 수 있습니다. devcenter.heroku.com/articles/local-maven-dependencies
Dirk

485

코드 만 버림

scope == system 설정하고 groupId, artifactId 및 version을 구성하십시오.

<dependency>
    <groupId>org.swinglabs</groupId>
    <artifactId>swingx</artifactId>
    <version>0.9.2</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/swingx-0.9.3.jar</systemPath>
</dependency>

참고 : 시스템 종속성은 결과 jar / war에 복사되지 않습니다
( maven을 사용하여 빌드 된 전쟁에 시스템 종속성을 포함하는 방법 참조 )


4
고마워 이것은 내가 정말로 원하는 것에 가깝습니다. 하나의 항목으로 모두 추가 할 수있는 방법이 있습니까? 10 개의 항아리가있는 / lib가 있다고 가정 해보십시오. 예를 들어 systemPath에 대해 /some/path/*.jar을 사용하여 어떻게 든 추가 할 수 있습니까? 또는 여전히 알려진 종속성으로 처리해야합니까? 그래도 정말 필요한 것에 가깝습니다. 감사합니다!

11
"<systemPath> $ {basedir} /lib/BrowserLauncher2-1_3.jar </ systemPath>"$ {basedir}이 (가) 프로젝트의 루트를 가리키고 있습니다.
Frederic Morin

4
프로젝트를 사용하는 것이 좋습니다. <systemPath> $ {project.basedir} /lib/AwesomeLib.jar </ systemPath>
Matthew McCullough

76
나는 이것이 OP가 요구 한 바라는 것을 이해하고 있지만, system스코프 를 사용하는 것은 강력히 권장되지 않는 끔찍한 관행임을 여전히 강조하고 싶다 . 종속성 + 범위를 참조하십시오 .
Pascal Thivent

6
@marioosh 질문의 원래 의도는 빠른 실험을위한 것임을 기억하십시오. mvn 꾸러미를 만들고 싶다면 jar를 저장소에 설치하십시오.
Pyrolistical

63

프로젝트에 로컬 저장소를 만들 수 있습니다

예를 들어 libs프로젝트 구조에 폴더가있는 경우

  • 에서 libs폴더는 디렉토리 구조를 같이 작성해야합니다 :/groupId/artifactId/version/artifactId-version.jar

  • pom.xml에서 저장소를 등록해야합니다

    <repository>
        <id>ProjectRepo</id>
        <name>ProjectRepo</name>
        <url>file://${project.basedir}/libs</url>
    </repository>
    
  • 평소처럼 의존성을 추가하십시오.

    <dependency>
        <groupId>groupId</groupId>
        <artifactId>artifactId</artifactId>
        <version>version</version>
    </dependency>
    

그게 다야

자세한 정보 : Maven에서 외부 라이브러리를 추가하는 방법


1
당신은 거의 맞습니다. groupId는 서버 서브 디렉토리에서 분할되어야합니다.
Peter Fortuin

5
물론 'com.foo.bar'와 같이 복잡한 groupId가있는 경우 디렉토리 구조는 /com/foo/bar/artifactId/version/artifactId-verion.jar
Dmytro Boichenko

이것은 1 년 전의 답변과 크게 다른가 ?
Joshua Taylor

jar 파일이있는 마지막 디렉토리에서 관련 pom xml 파일도 추가해야합니다.
Federico


15

이것은 내가 한 일이며 패키지 문제를 해결하고 체크 아웃 된 코드로 작동합니다.

필자의 경우에는 프로젝트에서 새 폴더를 repo만들었지 만 자유롭게 사용하십시오.src/repo

내 POM에서 공개 Maven 저장소에없는 종속성이있었습니다.

<dependency>
    <groupId>com.dovetail</groupId>
    <artifactId>zoslog4j</artifactId>
    <version>1.0.1</version>
    <scope>runtime</scope>
</dependency>

그런 다음 다음 디렉토리를 작성하고 repo/com/dovetail/zoslog4j/1.0.1JAR 파일을 해당 폴더에 복사했습니다.

다운로드 한 파일을 나타 내기 위해 다음 POM 파일을 만들었습니다 (이 단계는 선택 사항이지만 경고는 제거됨). 다음 사람이 파일을 시작할 위치를 파악하는 데 도움이됩니다.

<?xml version="1.0" encoding="UTF-8" ?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.dovetail</groupId>
    <artifactId>zoslog4j</artifactId>
    <packaging>jar</packaging>
    <version>1.0.1</version>
    <name>z/OS Log4J Appenders</name>
    <url>http://dovetail.com/downloads/misc/index.html</url>
    <description>Apache Log4j Appender for z/OS Logstreams, files, etc.</description>
</project>

내가 만든 두 개의 선택적 파일은 POM에 대한 SHA1 체크섬과 누락 된 체크섬 경고를 제거하는 JAR입니다.

shasum -b < repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.jar \
          > repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.jar.sha1

shasum -b < repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.pom \
          > repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.pom.sha1

마지막으로 로컬 저장소를 참조 할 수 있도록 pom.xml에 다음 조각을 추가합니다.

<repositories>
    <repository>
        <id>project</id>
        <url>file:///${basedir}/repo</url>
    </repository>
</repositories>

안녕하세요, pom 파일을 로컬 저장소 또는 jar 파일 옆에 두셨습니까?
Peymankh

위의 솔루션에서 JAR 파일 옆에있었습니다. 너무 많은 작업이므로 위의 솔루션이 마음에 들지 않습니다.
Archimedes Trajano

나는 아직도 내가 여기에 게시 한 솔루션을 선호한다 stackoverflow.com/questions/2229757/…
Archimedes Trajano

maven 설치 플러그인 을 사용 하여 jar를 로컬 리포지토리에 설치하는 것을 자동화 했지만이 방법이 마음에 듭니다.
Carl G

13

실제로 저장소를 통해 프레임 워크를 작성하고 종속성을 사전에 식별해야합니다. 시스템 범위를 사용하는 것은 "종속성 관리에 신경 쓰지 않기"때문에 사람들이 일반적으로 사용하는 실수입니다. 문제는이 작업을 수행하면 정상적인 조건에서 maven을 표시하지 않는 왜곡 된 maven 빌드로 끝납니다. 당신은 같은 방법 다음 더 나을 것 .


12

이것이 로컬 항아리를 추가하거나 설치하는 방법입니다

    <dependency>
        <groupId>org.example</groupId>
        <artifactId>iamajar</artifactId>
        <version>1.0</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/lib/iamajar.jar</systemPath>
    </dependency>

필수이므로 기본 groupId 및 artifactId를 지정했습니다. :)


11

Maven 설치 플러그인 에는 jar를 로컬 저장소에 설치하는 명령 행 사용법이 있으며 POM은 선택 사항이지만 GroupId, ArtifactId, Version 및 Packaging (모든 POM 항목)을 지정해야합니다.


실제로 그는 지역 저장소로 가져 오는 라이브러리에 대한 pom을 만들 필요가 없다는 점입니다.
Frederic Morin

5
-1, 때로는 jar 파일을 설치하는 데 어려움없이 추가하려고합니다.
Leonel

8

사용하는 <scope>system</scope>것은 다른 사람들이 설명 한 이유로 끔찍한 아이디어입니다. 파일을 로컬 저장소에 수동으로 설치하면 빌드를 재현 <url>file://${project.basedir}/repo</url>할 수 없으며 (1) 제대로 구성된 fileURL 이 아닐 수 있으므로 (예 : 프로젝트의 경우) (2)이 프로젝트의 POM이 다른 사람의 프로젝트의 종속성으로 사용되는 경우 결과를 사용할 수 없습니다.

이슈를 공개 저장소에 업로드하지 않으려는 경우 Simeon의 도우미 모듈 제안이 작업을 수행합니다. 그러나 지금 더 쉬운 방법이 있습니다…

추천

사용 비는-받는다는 항아리 - 받는다는 - 플러그인 . 다른 접근 방식의 단점은 없지만 원하는 것을 정확하게 수행합니다.


maven-jar-maven-plugin이 아닌 것이 더 사용하기 쉬운 것처럼 보이지만 maven-external-dependency-plugin을 보았습니다 .
Jesse Glick

8

이 작업을 수행하는 다른 방법을 찾았습니다 .Heroku 게시물 에서 여기를 참조하십시오.

요약 (복사 및 붙여 넣기에 대해 죄송합니다)

  • repo루트 폴더 아래 에 디렉토리를 작성하십시오 .
당신의 프로젝트
+-pom.xml
+-src
+-레포
  • 로컬 repo 디렉토리에 jar을 설치하려면 이것을 실행하십시오.
mvn deploy : 배포 파일 -Durl = file : /// path / to / yourproject / repo / -Dfile = mylib-1.0.jar -DgroupId = com.example -DartifactId = mylib -Dpackaging = jar -Dversion = 1.0
  • 이것을 당신의 추가하십시오 pom.xml:
<repositories>
    <!--other repositories if any-->
    <repository>
        <id>project.local</id>
        <name>project</name>
        <url>file:${project.basedir}/repo</url>
    </repository>
</repositories>


<dependency>
    <groupId>com.example</groupId>
    <artifactId>mylib</artifactId>
    <version>1.0</version>  
</dependency>

6

이러한 종류의 JAR을 올바르게 포장 한 것에 대해 CloudBees 직원들과 오랫동안 논의한 후 솔루션에 대한 흥미로운 좋은 제안을했습니다.

기존 POM 설치 : 설치 파일 실행으로 실행되는 기존 JAR을 기본 아티팩트로 첨부하는 가짜 Maven 프로젝트 작성. 다음은 이러한 POM kinf의 예입니다.

 <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.3.1</version>
            <executions>
                <execution>
                    <id>image-util-id</id>
                    <phase>install</phase>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                    <configuration>
                        <file>${basedir}/file-you-want-to-include.jar</file>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>${project.artifactId}</artifactId>
                        <version>${project.version}</version>
                        <packaging>jar</packaging>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

그러나이를 구현하려면 기존 프로젝트 구조를 변경해야합니다. 먼저, 그러한 각 종류의 JAR에 대해 다른 가짜 Maven 프로젝트 (모듈)를 만들어야한다는 것을 명심해야합니다. 그리고 모든 JAR 래퍼 및 기존 기본 프로젝트 인 모든 하위 모듈을 포함하여 상위 Maven 프로젝트를 만들어야합니다. 구조는 다음과 같습니다.

루트 프로젝트 (이것은 상위 POM 파일을 포함하며 모듈 XML 요소가있는 모든 하위 모듈을 포함합니다 ) (POM 패키징)

JAR 1 랩퍼 Maven 하위 프로젝트 (POM 패키징)

JAR 2 랩퍼 Maven 하위 프로젝트 (POM 패키징)

주요 기존 Maven 하위 프로젝트 (WAR, JAR, EAR .... 포장)

mvn : install 또는 mvn : packaging을 통해 실행되는 상위가 강제되고 하위 모듈이 실행될 때. 프로젝트 구조를 변경해야하기 때문에 마이너스로 간주 될 수 있지만 마지막에는 정적이 아닌 솔루션을 제공합니다.


관찰 만하지 만 추가하려는 각 JAR에 대해 새 POM을 생성해야한다고 생각하지 않습니다. 추가 하려는 jar에 대한 실행 블록을 제공하는 경우 모든 JAR을 추가 할 단일 POM을 작성하는 것으로 충분 합니다. 각 블록에 고유 한 ID가 있는지 확인하면됩니다. 결과적으로 모든 JAR을 로컬 저장소에 추가하는 단일 Maven 모듈이 생성됩니다. (만약 maven 좌표가 이미 존재하거나 나중에 추가 될 수있는 것과 충돌하지 않도록하십시오!)
Stormcloud

영웅. 이것은 내가 원하는 것입니다. 좋은 친구 야 2013 년은 좋은 한 해 였을 것입니다.)
ndtreviv

5

가장 간단한 것은 사용자 정의 jar을 포함하도록 maven-compiler-plugin을 구성하는 것입니다. 이 예제는 모든 jar 파일을 lib 디렉토리에로드합니다.

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <includes>
                    <include>lib/*.jar</include>
                </includes>
            </configuration>
        </plugin>

1
이 maven을 추가하면 says nothing to complile!
Ravi Parekh

그것은 말하는 all classes are up to date nothing to compile그것을 찾을 수 없기 때문에 *.java더 이상. 을 사용하여 다시 추가 할 수 있습니다 <include>**/*.java</include>. 항아리에 대한 나에게 성공하지 못했습니다
Michael Laffargue

@ Imiguelmh, 왜 이것이 항아리에서 작동하지 않습니까?
kisna


3

내가 찾은 이상한 해결책 :

이클립스 사용하기

  • 간단한 (만들지 않은) 자바 프로젝트 만들기
  • 메인 클래스 추가
  • 모든 병을 클래스 패스에 추가하십시오.
  • Runnable JAR 내보내기 (다른 방법이 없기 때문에 중요합니다)
  • 생성 된 JAR로 필수 라이브러리 추출을 선택하십시오.
  • 라이센스 문제를 결정
  • tadammm ... 생성 된 항아리를 m2repo에 설치하십시오.
  • 이 단일 종속성을 다른 프로젝트에 추가하십시오.

건배, 발린 트


3

빠르고 더러운 솔루션을 원할 경우 다음을 수행 할 수 있습니다 (테스트 프로젝트 이외의 용도로는 권장하지 않지만 maven은 길이가 적절하지 않다고 불평합니다).

필요한 각 jar 파일에 대한 종속성 항목을 펄 스크립트 또는 이와 유사한 것으로 추가하고 pom 파일에 복사하여 붙여 넣습니다.

#! /usr/bin/perl

foreach my $n (@ARGV) {

    $n=~s@.*/@@;

    print "<dependency>
    <groupId>local.dummy</groupId>
    <artifactId>$n</artifactId>
    <version>0.0.1</version>
    <scope>system</scope>
    <systemPath>\${project.basedir}/lib/$n</systemPath>
</dependency>
";

예, 이것이 바로 내가 찾던 것입니다. 연구 테스트 코드를 위해 그것을 추진하는 방법. 멋진 것은 없습니다. 예, 그것이 그들이 모두 말하는 것임을 알고 있습니다. pom 파일이있는 타사 라이브러리로 제공되는 항아리가 있습니다. 컴파일 / 실행을 원합니다. 파이썬에 사소하게 적응 한이 솔루션은 놀라운 일이었습니다. 잘라 내 폼에 붙여 넣습니다.
Paul

3

빠른 & 더티 (알렉스의 답변에 따라) 배치 솔루션 :

libs.bat

@ECHO OFF
FOR %%I IN (*.jar) DO (
echo ^<dependency^>
echo ^<groupId^>local.dummy^</groupId^>
echo ^<artifactId^>%%I^</artifactId^>
echo ^<version^>0.0.1^</version^>
echo ^<scope^>system^</scope^>
echo ^<systemPath^>${project.basedir}/lib/%%I^</systemPath^>
echo ^</dependency^>
)

다음과 같이 실행하십시오 libs.bat > libs.txt. 그런 다음 libs.txt컨텐츠를 종속성으로 열고 복사하십시오.

필자의 경우 코드를 컴파일하기 위해 라이브러리 만 필요 했으며이 솔루션은 그 목적에 가장 적합했습니다.


2

그것이 귀하의 문제에 정확히 맞지 않더라도 여기에 떨어 뜨릴 것입니다. 내 요구 사항은 다음과 같습니다.

  1. 온라인 maven 저장소에서 찾을 수없는 jar은 SVN에 있어야합니다.
  2. 한 개발자가 다른 라이브러리를 추가하는 경우 다른 개발자가 수동으로 설치하지 않아도됩니다.
  3. IDE (필자의 경우 NetBeans)는 자동 완성 및 도움말을 제공하는 소스 및 javadoc을 찾을 수 있어야합니다.

먼저 (3)에 대해 이야기 해 봅시다 : IDE 에이를 이해하지 못하기 때문에 항아리에 폴더에 항아리를 넣고 최종 항아리에 병합하는 것은 여기에서 작동하지 않습니다. 이것은 모든 라이브러리가 올바르게 설치되어야 함을 의미합니다. 그러나 모든 사람이 "mvn install-file"을 사용하여 설치하고 싶지는 않습니다.

내 프로젝트에는 metawidget이 필요했습니다. 여기 우리는 간다 :

  1. 새로운 maven 프로젝트를 만듭니다 (이름을 "shared-libs"또는 이와 비슷한 이름으로 지정).
  2. metawidget을 다운로드하고 압축을 src / main / lib에 추출하십시오.
  3. doc / api 폴더에는 javadoc이 포함되어 있습니다. 내용의 zip을 만듭니다 (doc / api / api.zip).
  4. 이처럼 폼을 수정하십시오
  5. 프로젝트를 빌드하면 라이브러리가 설치됩니다.
  6. 라이브러리를 프로젝트에 대한 종속성으로 추가하거나 (shared-libs 프로젝트에 종속성을 추가 한 경우) shared-lib를 종속성으로 추가하여 모든 라이브러리를 한 번에 가져옵니다.

새 라이브러리가있을 때마다 새 실행을 추가하고 모든 사람에게 프로젝트를 다시 빌드하도록 지시하십시오 (프로젝트 계층 구조를 사용하여이 프로세스를 개선 할 수 있음).


Maven 을 확인하고 싶을 수도 있습니다 . 상대 경로로 항아리에 종속성을 추가 하십시오 (IMHO가 더 나은 대안입니다).
파스칼 티 벤트

로컬 저장소가 항상 프로젝트에 대한 상대 경로를 동일하게 유지할 수 있으면 더 좋습니다. 다른 위치에 많은 프로젝트 (또는 다른 지점)가 있으면 작동하지 않습니다.
Cephalopod

내 대답 에는 프로젝트 내부의 항아리에 대해 pom.xml에 알리는 방법이 있습니다. 왜 그렇게하지 말고 $ {basedir} / lib의 jar를 가리켜 야합니까?
Ed Brannin

1
@Ed 이것은 시스템 범위의 목적이 아니기 때문에 시스템 범위의 종속성에는 많은 부작용이 있습니다. 이것은 완전히 금지되어야하는 끔찍한 관행입니다.
Pascal Thivent

2

maven 저장소에없는 타사 jar를 설치하려면 maven-install-plugin을 사용하십시오.

단계는 다음과 같습니다.

  1. 소스 (웹 사이트)에서 jar 파일을 수동으로 다운로드
  2. 폴더를 만들고 jar 파일을 폴더에 넣으십시오.
  3. 아래 명령을 실행하여 로컬 jar 저장소에 타사 jar을 설치하십시오.

mvn install : install-file -Dfile = -DgroupId = -DartifactId = -Dversion = -Dpackaging =

아래는 simonsite log4j에 사용한 예입니다.

mvn install : install-file -Dfile = / Users / athanka / git / MyProject / repo / log4j-rolling-appender.jar -DgroupId = uk.org.simonsite -DartifactId = log4j-rolling-appender -Dversion = 20150607-2059- Dpackaging = jar

  1. pom.xml에는 다음과 같은 종속성이 포함됩니다.

      <dependency> 
            <groupId>uk.org.simonsite</groupId>
            <artifactId>log4j-rolling-appender</artifactId>
            <version>20150607-2059</version> 
      </dependency>
  2. mvn clean install 명령을 실행하여 패키징을 작성하십시오.

아래는 참조 링크입니다.

https://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html


이것은 경계선 링크 전용 답변 입니다. 여기에 많은 정보를 포함하도록 답변을 확장하고 참조 용으로 만 링크를 사용해야합니다.
Goodbye StackExchange

2

여기에 좋은 대답을 찾지 못한 사람들에게는 이것이 필요한 모든 의존성을 가진 항아리를 얻기 위해 우리가하고있는 일입니다. 이 답변 ( https://stackoverflow.com/a/7623805/1084306 )은 Maven Assembly 플러그인 사용에 대해 언급하지만 실제로 답변에 예제를 제공하지는 않습니다. 그리고 답변의 끝까지 끝까지 읽지 않으면 (아주 ​​길다) 놓칠 수 있습니다. pom.xml에 아래를 추가하면target/${PROJECT_NAME}-${VERSION}-jar-with-dependencies.jar

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.4.1</version>
            <configuration>
                <!-- get all project dependencies -->
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <!-- MainClass in mainfest make a executable jar -->
                <archive>
                  <manifest>
                    <mainClass>my.package.mainclass</mainClass>
                  </manifest>
                </archive>

            </configuration>
            <executions>
              <execution>
                <id>make-assembly</id>
                <!-- bind to the packaging phase -->
                <phase>package</phase> 
                <goals>
                    <goal>single</goal>
                </goals>
              </execution>
            </executions>
        </plugin>

1

@ alex lehmann 's의 답변에 대한 주석에서 파이썬 코드를 언급 했으므로 여기에 게시하고 있습니다.

def AddJars(jarList):
  s1 = ''
  for elem in jarList:
   s1+= """
     <dependency>
        <groupId>local.dummy</groupId>
        <artifactId>%s</artifactId>
        <version>0.0.1</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/manual_jars/%s</systemPath>
     </dependency>\n"""%(elem, elem)
  return s1

0

이것은 POM에 그것들을 추가하는 방법에 대한 대답이 아니며 더 똑똑하지 않을 수도 있지만 클래스 경로 작업에 lib 디렉토리를 추가하는 것입니까? 내 Maven 저장소에 추가하고 싶지 않은 외부 항아리가 필요할 때 내가하는 일임을 알고 있습니다.

도움이 되었기를 바랍니다.


1
이것이 내가하고있는 일이며 효과가 있지만 글로벌 클래스 경로를 오염시키고 그것을 벗어나려고합니다. 감사!

@purple 정확히 어떻게 했습니까?
TheRealChx101 23

0

프로젝트에서 작동하는 것은 Archimedes Trajano가 작성한 것이지만 .m2 / settings.xml에는 다음과 같은 내용이 있습니다.

 <mirror>
  <id>nexus</id>
  <mirrorOf>*</mirrorOf>
  <url>http://url_to_our_repository</url>
 </mirror>

*는 중앙으로 변경해야합니다. 따라서 그의 답변이 효과가 없다면 settings.xml을 확인해야합니다.


0

방금 빠르고 더러운 해결 방법을 원했습니다 ... Nikita Volkov에서 스크립트를 실행할 수 없습니다 : 구문 오류 + 항아리 이름에 대해 엄격한 형식이 필요합니다.

jar 파일 이름의 모든 형식으로 작동하는이 Perl 스크립트를 만들었으며 XML에 종속성을 생성하여 pom에 직접 복사하여 붙여 넣을 수 있습니다.

당신이 그것을 사용하려는 경우, 당신은 스크립트가 무엇을하고 있는지 알고 있어야합니다, 당신은 변경해야 할 수도 있습니다 lib폴더와 값 groupId또는 artifactId...

#!/usr/bin/perl

use strict;
use warnings;

open(my $fh, '>', 'dependencies.xml') or die "Could not open file 'dependencies.xml' $!";
foreach my $file (glob("lib/*.jar")) {
    print "$file\n";
    my $groupId = "my.mess";
    my $artifactId = "";
    my $version = "0.1-SNAPSHOT";
    if ($file =~ /\/([^\/]*?)(-([0-9v\._]*))?\.jar$/) {
        $artifactId = $1;
        if (defined($3)) {
            $version = $3;
        }
        `mvn install:install-file -Dfile=$file -DgroupId=$groupId -DartifactId=$artifactId -Dversion=$version -Dpackaging=jar`;
        print $fh "<dependency>\n\t<groupId>$groupId</groupId>\n\t<artifactId>$artifactId</artifactId>\n\t<version>$version</version>\n</dependency>\n";
        print " => $groupId:$artifactId:$version\n";
    } else {
        print "##### BEUH...\n";
    }
}
close $fh;

0

Java의 scope = 'system'접근 방식에 대한 솔루션 :

public static void main(String[] args) {
        String filepath = "/Users/Downloads/lib/";
        try (Stream<Path> walk = Files.walk(Paths.get(filepath))) {

        List<String> result = walk.filter(Files::isRegularFile)
                .map(x -> x.toString()).collect(Collectors.toList());

                String indentation = "    ";
                for (String s : result) {
                    System.out.println(indentation + indentation + "<dependency>");
                    System.out.println(indentation + indentation + indentation + "<groupId>"
                            + s.replace(filepath, "").replace(".jar", "")
                            + "</groupId>");
                    System.out.println(indentation + indentation + indentation + "<artifactId>"
                            + s.replace(filepath, "").replace(".jar", "")
                            + "</artifactId>");
                    System.out.println(indentation + indentation + indentation + "<version>"
                            + s.replace(filepath, "").replace(".jar", "")
                            + "</version>");
                    System.out.println(indentation + indentation + indentation + "<scope>system</scope>");
                    System.out.println(indentation + indentation + indentation + "<systemPath>" + s + "</systemPath>");
                    System.out.println(indentation + indentation + "</dependency>");
                }

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