ProgramingTip

해당하는 Maven 2 어셈블리 : "시스템"범위의 jar가 포함되지 않음

bestdevel 2020. 12. 7. 20:30
반응형

해당하는 Maven 2 어셈블리 : "시스템"범위의 jar가 포함되지 않음


maven-assembly를 사용하여 다음과 같은 내용을 포함하여 내 응용 프로그램의 항아리를 만들고 있습니다.

<assembly>
    <id>macosx</id>
    <formats>
       <format>tar.gz</format>
       <format>dir</format>
    </formats>
    <dependencySets>
        <dependencySet>
            <includes>
                <include>*:jar</include>
            </includes>
            <outputDirectory>lib</outputDirectory>
        </dependencySet>
    </dependencySets>
</assembly>

(질문과 관련이없는 다른 부분은 생략했습니다)

지금부터 lib모든 디렉토리가 있는 디렉토리를 생성하여 작동 작동했습니다 . 그러나 최근에 범위가 인 새 system구문 을 추가 하고자하는 lib내용에 복사하지 않습니다 . 여기에 기본적인 것이 없어서 도움을 요청합니다.

방금 추가 한 추가 한은 다음과 가변합니다.

<dependency>
  <groupId>sourceforge.jchart2d</groupId>
  <artifactId>jchart2d</artifactId>
  <version>3.1.0</version>
  <scope>system</scope>
  <systemPath>${project.basedir}/external/jchart2d-3.1.0.jar</systemPath>
</dependency>

이을 포함 할 수있는 유일한 방법은 어셈블리 요소에 다음을 추가하는 것입니다.

<files>
    <file>
        <source>external/jchart2d-3.1.0.jar</source>
        <outputDirectory>lib</outputDirectory>
    </file>
</files>

그러나 이것은 단지 이름이 바있는 때마다 pom과 어셈블리 파일을 변경해야합니다. 또한 그것은 잘못된 것입니다.

나는 함께 시도 <scope>runtime</scope>에서 dependencySets<include>sourceforge.jchart2d:jchart2d</include>행운으로.

그렇다면 system메이븐 2 어셈블리 파일에의 범위 지정된 항아리를 어떻게 포함 합니까?

고마워


시스템 범위가 추가적으로 제공되는 것은 사실이 놀랍지 제공되지 않는다. 실제로 로컬 저장소에 매장을 저장하지 않는 경우에 (예 : 프로젝트의 일부로 배포하려는 경우) 다음과합니다.

  • 프로젝트의 로컬 "파일 시스템 저장소"에 넣을 것입니다.
  • 다음 pom.xml과 같이 저장소를 선언합니다 .

    <repositories>
      <repository>
        <id>my</id>
        <url>file://${basedir}/my-repo</url>
      </repository>
    </repositories>
    
  • system스코프 없이 아티팩트를 선언 할 것입니다 . 이 문제의 원인입니다.

    <dependency>
      <groupId>sourceforge.jchart2d</groupId>
      <artifactId>jchart2d</artifactId>
      <version>3.1.0</version>
    </dependency>
    

이것이 귀하의 요구에 맞을 것이 100 % 보장되지 않는 시스템 범위를 사용하는 것보다 더 나은 솔루션이라고 생각합니다.

업데이트 : 원래 답변에서 언급 된 것이 지금 수정 중입니다. -based 저장소에 파일 타사 라이브러리를 설치하려면

install:install-file다음 매개 변수 와 함께 사용 하십시오 .localRepositoryPath

mvn install:install-file -Dfile=<path-to-file> \
                         -DgroupId=<myGroup> \
                         -DartifactId=<myArtifactId> \
                         -Dversion=<myVersion> \
                         -Dpackaging=<myPackaging> \
                         -DlocalRepositoryPath=<path-to-my-repo>

* nix 쉘에있는 그대로 넣을 수 있습니다. 창에서 " \"를 제거하고 모든 것을 줄에 대조하십시오.


Btw 당신은 그것을 사용하여 당신의 메이븐 빌드의 일부로 만들 수 있습니다. 다음은 준비 전에 jar를 로컬 저장소에 설치합니다.

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <executions>
                <execution>
                    <id>hack-binary</id>
                    <phase>validate</phase>
                    <configuration>
                        <file>${basedir}/lib/your-lib.jar</file>
                        <repositoryLayout>default</repositoryLayout>
                        <groupId>your-group</groupId>
                        <artifactId>your-artifact</artifactId>
                        <version>0.1</version>
                        <packaging>jar</packaging>
                        <generatePom>true</generatePom>
                    </configuration>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

항아리를 만드는 경우 쉬운 해결을 찾습니다.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-war-plugin</artifactId>
  <version>2.1.1</version>
  <configuration>
    <webResources>
    <resource>
      <directory>dependencies/mydep</directory>
        <targetPath>WEB-INF/lib</targetPath>
        <filtering>true</filtering>
        <includes>
           <include>**/*.jar</include>
        </includes>
    </resource>
  </webResources>
</configuration>
</plugin>

또한 dependencySet에 추가 dependencySet을 추가하여 처리 할 수도 있습니다.

<dependencySet>
  <scope>system</scope>
  <includes>
    <include>*:jar</include>
  </includes>
  <outputDirectory>lib</outputDirectory>
</dependencySet>

가장 좋은 방법은 Repository Manager (예 : Nexus, Artifactory, Archiva)를 사용하고 특정 저장소에 이러한 종류의 종속성을 설치하는 것입니다. 그런 다음 간단한 종속성과 같은 것을 사용할 수 있습니다. 이것은 당신의 삶을 단순화 할 것입니다.

문서 : https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html


편집 됨 : alx가 클린 라이프 사이클 해결 방법에 대해서도 언급 한 사실을 몰랐습니다.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-install-plugin</artifactId>
    <executions>
        <execution>
            <id>hack-binary</id>
            <phase>clean</phase>
            <configuration>
                <file>${basedir}/lib/your-lib.jar</file>
                <repositoryLayout>default</repositoryLayout>
                <groupId>your-group</groupId>
                <artifactId>your-artifact</artifactId>
                <version>0.1</version>
                <packaging>jar</packaging>
                <generatePom>true</generatePom>
            </configuration>
            <goals>
                <goal>install-file</goal>
            </goals>
        </execution>
    </executions>
</plugin>

alx에서 제공하는 솔루션을 기반으로 클린 단계에서 설치 파일 단계를 실행할 수 있습니다. 그러나 정리 단계는 기본 라이프 사이클에 없기 mvn clean때문에 처음 에 실행 하여 jar가 로컬 저장소에서 준비되었는지 확인해야합니다.

예 : mvn clean; mvn 패키지


이에 대한 간단한 해결책은 로컬 Maven 저장소에 추가하는 것입니다.

한 가지 방법은 이전 게시물에서 제안한대로 mvn install 명령을 사용하는 것입니다.

또 다른 쉬운 방법은 1) 일식에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하여 Maven 옵션을 선택하는 것입니다. 2) Maven 저장소에 아티팩트 설치 또는 배포 옵션을 선택하고 다음을 클릭하십시오. 3) Artifact 파일 확인란 옆에있는 찾아보기를 클릭하고 jar 파일을 선택합니다. 4) GroupId 및 ArtifactId 및 버전을 입력하여 pom 생성 및 체크섬 생성이 확인되고 패키징이 jar인지 확인합니다.

마침을 클릭하십시오 .Wallah !!! 작업이 완료되었습니다. jar는 setting.xml 또는 m2 디렉토리에서 정의 할 수있는 로컬 저장소에 추가됩니다.

이제 가져 오기에 따라 입력 한 GroupId, ArtifactId 및 jar 버전에 따라 간단한 maven 종속성을 추가하면 외부 jar가 maven에 의해 패키징됩니다.


내 솔루션에서 더 쉬운 방식으로 작동했습니다.

종속성에서 제거하십시오.

<dependency>
  <groupId>tiago.medici</groupId>
  <artifactId>eureka</artifactId>
  <version>0.0.1</version>
</dependency> 

그런 다음 pom.xml에도 maven-install-plugin을 추가합니다.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-install-plugin</artifactId>
  <executions>
    <execution>
      <id>install-external</id>
      <phase>clean</phase>
      <configuration>
        <file>${basedir}/external/tiago.medici-0.0.1.jar</file>
        <repositoryLayout>default</repositoryLayout>
        <groupId>tiago.medici</groupId>
        <artifactId>eureka</artifactId>
        <version>0.0.1</version>
        <packaging>jar</packaging>
        <generatePom>true</generatePom>
      </configuration>
      <goals>
        <goal>install-file</goal>
      </goals>
    </execution>
  </executions>
</plugin>

참고 URL : https://stackoverflow.com/questions/2065928/maven-2-assembly-with-dependencies-jar-under-scope-system-not-included

반응형