[java] Maven과 jar 파일에 의존성 포함하기



5 Answers

Maven 2의 경우 올바른 방법은 Maven2 Assembly Plugin 을 사용하는 것입니다. Maven2 Assembly Plugin미리 정의 된 설명자 파일 을 가지고 있으며 명령 줄에서 사용할 수 있습니다.

mvn assembly:assembly -DdescriptorId=jar-with-dependencies

이 jar을 실행 가능하게하려면 플러그인 구성에 실행할 기본 클래스를 추가하십시오.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <configuration>
    <archive>
      <manifest>
        <mainClass>my.package.to.my.MainClass</mainClass>
      </manifest>
    </archive>
  </configuration>
</plugin>

일반 빌드 프로세스의 일부로 해당 어셈블리를 만들려면 single 또는 directory-single 목표 ( assembly 목표 만 명령 줄에서 실행해야 함)를 라이프 사이클 단계 ( package 가 의미가 있음)로 바인딩해야합니다 이:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <executions>
    <execution>
      <id>create-my-bundle</id>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        ...
      </configuration>
    </execution>
  </executions>
</plugin>

필요에 맞게 configuration 요소를 적용하십시오 (예 : 매니페스트 사용법).

Question

maven (2.0.9)가 모든 jar 파일을 하나의 jar 파일에 포함하도록 강제하는 방법이 있습니까?

나는 하나의 jar 파일로 빌드 된 프로젝트를 가지고있다. 종속성의 클래스를 jar 파일에도 복사해야합니다.

업데이트 : JAR 파일에 jar 파일을 포함시킬 수 없다는 것을 알고 있습니다. 내가 의존성으로 지정된 항아리를 풀고, 항아리에 클래스 파일을 패키지하는 방법을 찾고있다.




<classifier> 태그를 사용하여 새로 생성 된 jar를 사용할 수 있습니다.

<dependencies>
    <dependency>
        <groupId>your.group.id</groupId>
        <artifactId>your.artifact.id</artifactId>
        <version>1.0</version>
        <type>jar</type>
        <classifier>jar-with-dependencies</classifier>
    </dependency>
</dependencies>



감사합니다. POM.xml 파일에 아래 스 니펫을 추가하고 Mp 문제를 해결하고 모든 종속 항아리를 포함하는 팻말 파일을 만듭니다.

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <descriptorRefs>
                <descriptorRef>dependencies</descriptorRef>
            </descriptorRefs>
        </configuration>
    </plugin>
</plugins>



음영 메이븐 플러그인이 있습니다. 의존성을 패키지하고 이름을 변경 하는 데 사용할 수 있습니다 (클래스 경로의 종속성 문제점을 생략).




이 게시물은 약간 오래된 것일 수 있지만 최근에 같은 문제가 발생했습니다. John Stauffer가 제안한 첫 번째 해결책은 좋은 것이지만 이번 봄에 일할 때 몇 가지 문제가있었습니다. 내가 사용하는 스프링의 의존성 항아리에는 동일한 경로와 이름을 공유하는 일부 속성 파일과 xml 스키마 선언이 있습니다. 이 jar가 같은 버전에서 왔지만 jar-with-dependencies maven-goal은이 파일을 마지막으로 발견 된 파일로 겹쳐 쓰는 것이 었습니다.

결국 스프링 jars가 올바른 특성 파일을 찾을 수 없으므로 응용 프로그램을 시작할 수 없었습니다. 이 경우 Rop이 제안한 해결책이 내 문제를 해결했습니다.

또한 그 이후로, 현재 스프링 부트 프로젝트가 존재합니다. 패키지 목표에 과부하가 걸리고 자신의 클래스 로더를 제공하는 목표를 제공함으로써이 문제를 관리하는 매우 멋진 방법이 있습니다. 스프링 부츠 참조 안내서




Eclipse Luna 및 m2eclipse에 대한 내 최종 솔루션 : 사용자 정의 클래스 로더 (프로젝트에 5 개의 클래스 만 다운로드하고 추가) : http://git.eclipse.org/c/jdt/eclipse.jdt.ui.git/plain/org.eclipse.jdt.ui/jar%20in%20jar%20loader/org/eclipse/jdt/internal/jarinjarloader/ ; 이 클래스 로더는 one-jar 클래스 로더의 최상이며 매우 빠릅니다.

<project.mainClass>org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader</project.mainClass> <project.realMainClass>my.Class</project.realMainClass>

JIJConstants의 "Rsrc-Class-Path"에서 "Class-Path"로 편집
mvn clean dependency : 복사 의존성 패키지
씬 클래스 로더가있는 lib 폴더에 종속성이있는 항아리가 만들어집니다.

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.java</include>
                <include>**/*.properties</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <includes>
                <include>**/*</include>
            </includes>
            <targetPath>META-INF/</targetPath>
        </resource>
        <resource>
            <directory>${project.build.directory}/dependency/</directory>
            <includes>
                <include>*.jar</include>
            </includes>
            <targetPath>lib/</targetPath>
        </resource>
    </resources>
<pluginManagement>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>${project.mainClass}</mainClass>
                            <classpathPrefix>lib/</classpathPrefix>
                        </manifest>

                        <manifestEntries>
                            <Rsrc-Main-Class>${project.realMainClass}  </Rsrc-Main-Class>
                            <Class-Path>./</Class-Path>
                        </manifestEntries>

                    </archive>
                </configuration>
            </plugin>
<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </pluginManagement>
</build>



Related