복붙노트

[SPRING] Maven을 사용하여 스프링 기반 실행 파일 병을 만드는 방법은 무엇입니까?

SPRING

Maven을 사용하여 스프링 기반 실행 파일 병을 만드는 방법은 무엇입니까?

단일 병으로 패키징하고자하는 Maven 기반의 Spring-WS 클라이언트 프로젝트가 있습니다. 일식에서는 모든 것이 제대로 실행됩니다. 실행 가능한 jar 파일로 패키지하려고하면 Spring jar 파일이 응용 프로그램 jar에 포함되어 있지 않기 때문에 ClassNotFound 예외가 발생합니다.

그래서 maven-shade-plugin을 추가하여 응용 프로그램 jar에 모든 종속성을 포함 시켰습니다. 내 응용 프로그램 항아리를 보면, 모든 종속 파일의 모든 클래스 파일이 포함되어 있습니다 (모든 라이브러리 항아리가 폭발했습니다).

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>com.cws.cs.Client</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>1.7</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>

        </plugin>
    </plugins>
</build>

내 문제는 패키징 프로세스에서 여러 스프링 종속성이 서로 다른 META-INF / spring.schemas 파일을 가지고 있다는 것입니다. 결과적으로 내 마지막 항아리에는 불완전한 spring.schemas 파일이 있습니다.

따라서 실행 가능한 jar 파일을 실행하려고하면 spring.schemas 파일이 불완전하기 때문에 파일을 찾을 수 없다는 Spring 오류 메시지가 나타납니다 (Spring-WS의 jar 파일은 spring-core의 spring.schemas 파일을 오버라이드했습니다).

내 실행 가능한 jar의 META-INF / spring.schemas :

http\://www.springframework.org/schema/web-services/web-services-1.5.xsd=/org/springframework/ws/config/web-services-1.5.xsd
http\://www.springframework.org/schema/web-services/web-services-2.0.xsd=/org/springframework/ws/config/web-services-2.0.xsd
http\://www.springframework.org/schema/web-services/web-services.xsd=/org/springframework/ws/config/web-services-2.0.xsd

Spring-beans.jar 대신 META-INF / spring.schemas :

http\://www.springframework.org/schema/beans/spring-beans-2.0.xsd=org/springframework/beans/factory/xml/spring-beans-2.0.xsd
http\://www.springframework.org/schema/beans/spring-beans-2.5.xsd=org/springframework/beans/factory/xml/spring-beans-2.5.xsd
http\://www.springframework.org/schema/beans/spring-beans-3.0.xsd=org/springframework/beans/factory/xml/spring-beans-3.0.xsd
http\://www.springframework.org/schema/beans/spring-beans-3.1.xsd=org/springframework/beans/factory/xml/spring-beans-3.1.xsd
http\://www.springframework.org/schema/beans/spring-beans.xsd=org/springframework/beans/factory/xml/spring-beans-3.1.xsd
http\://www.springframework.org/schema/tool/spring-tool-2.0.xsd=org/springframework/beans/factory/xml/spring-tool-2.0.xsd
http\://www.springframework.org/schema/tool/spring-tool-2.5.xsd=org/springframework/beans/factory/xml/spring-tool-2.5.xsd
http\://www.springframework.org/schema/tool/spring-tool-3.0.xsd=org/springframework/beans/factory/xml/spring-tool-3.0.xsd
http\://www.springframework.org/schema/tool/spring-tool-3.1.xsd=org/springframework/beans/factory/xml/spring-tool-3.1.xsd
http\://www.springframework.org/schema/tool/spring-tool.xsd=org/springframework/beans/factory/xml/spring-tool-3.1.xsd
http\://www.springframework.org/schema/util/spring-util-2.0.xsd=org/springframework/beans/factory/xml/spring-util-2.0.xsd
http\://www.springframework.org/schema/util/spring-util-2.5.xsd=org/springframework/beans/factory/xml/spring-util-2.5.xsd
http\://www.springframework.org/schema/util/spring-util-3.0.xsd=org/springframework/beans/factory/xml/spring-util-3.0.xsd
http\://www.springframework.org/schema/util/spring-util-3.1.xsd=org/springframework/beans/factory/xml/spring-util-3.1.xsd
http\://www.springframework.org/schema/util/spring-util.xsd=org/springframework/beans/factory/xml/spring-util-3.1.xsd

나는 혼란 스럽다. 모든 실행 파일을 하나의 실행 파일로 패키지화 할 수 있는지는 확실하지 않습니다. 이것이 그늘 - 플러그인 구성 문제인지 또는 불가능한 일을하려고하는지 알 수 없습니다. 내 수동으로 spring.schemas 파일 (다른 파일의 연결)을 수동으로 만들어야하는 것은 맞지 않을 것입니다.

나는 총을 조금 올랐을지도 모른다. 그늘 플러그인에 대한 더 많은 정보를 파헤 치면서 이전에 놓친 AppendingTransformer를 발견했습니다. 그러나, 내 관심사는 다른 파일이 같은 문제를 겪고 있는지 어떻게 알 수 있습니까? 나는이 특별한 Spring 문제를 발견했다. 비슷한 일을하고있는 다른 라이브러리에 대해서는 전혀 몰라요.

모든 제안을 부탁드립니다.

해결법

  1. ==============================

    1.maven-shade-plugin 대신 onejar-maven-plugin을 사용하십시오. One-JAR을 사용하면 종속성 Jar와 함께 Java 응용 프로그램을 단일 실행 파일 Jar 파일로 패키지 할 수 있습니다.

    maven-shade-plugin 대신 onejar-maven-plugin을 사용하십시오. One-JAR을 사용하면 종속성 Jar와 함께 Java 응용 프로그램을 단일 실행 파일 Jar 파일로 패키지 할 수 있습니다.

  2. ==============================

    2.모든 jar의 .schema 파일 내용이 함께 추가되도록 다음 구성을 추가 할 수 있습니다.

    모든 jar의 .schema 파일 내용이 함께 추가되도록 다음 구성을 추가 할 수 있습니다.

    <configuration>
      <transformers>
        <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
          <resource>META-INF/spring.handlers</resource>
        </transformer>
        <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
          <resource>META-INF/spring.schemas</resource>
        </transformer>
      </transformers>
    </configuration>
    
  3. ==============================

    3.어제도이 문제가 발생했습니다.

    어제도이 문제가 발생했습니다.

    해결책은 수동 연결 및 어셈블리 플러그인 구성에서 필요한 파일을 준비하는 것입니다.

      <files>
        <file>
            <source>src/META-INF/spring.schemas</source>
            <outputDirectory>META-INF</outputDirectory>
        </file>
        <file>
            <source>src/META-INF/spring.handlers</source>
            <outputDirectory>META-INF</outputDirectory>
        </file>
      </files>
      <dependencySets>
        <dependencySet>
          <outputDirectory>/</outputDirectory>
          <useProjectArtifact>true</useProjectArtifact>
          <unpack>true</unpack>
          <scope>runtime</scope>
          <unpackOptions>
            <excludes>
                <exclude>META-INF/spring.handlers</exclude>
                <exclude>META-INF/spring.schemas</exclude>
            </excludes>
          </unpackOptions>  
        </dependencySet>
      </dependencySets>
    

    참고 : 하나의 항아리 접근법을 사용하는 것만으로는 충분하지 않습니다. 손으로 혼합 된 파일에 대해서는 확신 할 수 없으며, 모든 의존성을 그대로 유지하려고 시도합니다 ...

  4. ==============================

    4.maven-assembly-plugin을 사용해 보셨습니까?

    maven-assembly-plugin을 사용해 보셨습니까?

    그것은 당신을 위해 의존성을 가진 하나의 jar를 생성 할 것이고, 더 나아가이 jar가 실행 가능하게 만들 수 있습니다 :

    mainClass를 사용하여 실행할 클래스를 지정하십시오.

    <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <archive>
            <manifest>
              <mainClass>org.sample.App</mainClass>
            </manifest>
          </archive>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id> <!-- this is used for inheritance merges -->
            <phase>package</phase> <!-- bind to the packaging phase -->
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    
  5. ==============================

    5.

    assembly plugin have issues, use below plugin
    
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
                <configuration>
                    <transformers>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                            <mainClass>at.seresunit.lecturemanager_connector.App</mainClass>
                        </transformer>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                            <resource>META-INF/spring.handlers</resource>
                        </transformer>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                            <resource>META-INF/spring.schemas</resource>
                        </transformer>
                    </transformers>
                </configuration>
            </execution>
        </executions>
    </plugin>
    
    you may get security exception resolve it using below configuration
    
     <configuration>
        <filters>
            <filter>
                <artifact>*:*</artifact>
                <excludes>
                    <exclude>META-INF/*.SF</exclude>
                    <exclude>META-INF/*.DSA</exclude>
                    <exclude>META-INF/*.RSA</exclude>
                </excludes>
            </filter>
        </filters>
    </configuration>
    
  6. from https://stackoverflow.com/questions/11160534/how-to-create-spring-based-executable-jar-with-maven by cc-by-sa and MIT license