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

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

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

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

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



답변

대중적인 접근 방식의 문제

인터넷에서 찾을 수있는 대부분의 답변은 로컬 저장소에 종속성을 설치하거나 “시스템”범위를 지정하고 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의 공식 문서는 이해하기 쉽습니다.


답변

코드 만 버림

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을 사용하여 빌드 된 전쟁에 시스템 종속성을 포함하는 방법 참조 )


답변

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

예를 들어 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에서 외부 라이브러리를 추가하는 방법


답변

참고 : 시스템 범위를 사용할 때 ( 이 페이지에서 언급 한대로 ) Maven에는 절대 경로가 필요합니다.

jar 파일이 프로젝트의 루트에있는 경우, systemPath 값 앞에 $ {basedir}을 붙이고 싶을 것입니다.


답변

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

필자의 경우에는 프로젝트에서 새 폴더를 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>


답변

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


답변

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

    <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를 지정했습니다. 🙂