2012-11-12 5 views
0

BackGround : 저는 Spring과 Maven을 사용하는 독립 실행 형 응용 프로그램을 개발 중입니다. 원격 서버에 배포하고 테스트 할 수 있도록 내 응용 프로그램에서 jar 파일을 만들고 싶습니다. 제가 일식을 통해 실행 항아리 등이 병을 수출하고 언제 문제 아래에 직면하고있다Maven을 사용하여 jar에 의존성을 패키지하는 방법은 무엇입니까?

(1), 나는 예외 아래 얻고있다.
Exception in thread "main" 

org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHan 
dler for XML schema namespace [http://www.springframework.org/schema/context] 
Offending resource: class path resource [applicationContext.xml] 

는 spring.handlers 파일 네임 스페이스 충돌과 함께 위의 문제는, 그래서, 아래와 같이 메이븐의 플러그인을 사용하여 항아리를 만들 생각입니다.

<plugin> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.2</version> 
      <configuration> 
      <archive> 
       <manifest> 
        <addClasspath>true</addClasspath> 
        <mainClass>com.comcast.start.Application</mainClass> 
       </manifest> 
     </archive> 
      <shadedArtifactAttached>true</shadedArtifactAttached> 
      <shadedClassifierName>jar-with-dependencies</shadedClassifierName> 
      <finalName>ds</finalName> 
      <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> 
       <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
        <resource>META-INF/spring.tooling</resource> 
       </transformer> 
      </transformers> 
     </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> 
        <configuration> 
         <outputDirectory>${project.build.directory}/alternateLocation</outputDirectory> 
         <overWriteReleases>false</overWriteReleases> 
         <overWriteSnapshots>false</overWriteSnapshots> 
         <overWriteIfNewer>true</overWriteIfNewer> 
        </configuration> 
        </execution> 
       </executions> 
     </plugin> 

하지만 여기서 문제는 종속 라이브러리를 내 jar 파일에 복사하는 플러그인을 찾을 수 없다는 것입니다. 복사 의존성 플러그인은 파일을 내 작업 공간으로 복사하지만 라이브러리를 내 JAR 파일에 배치하지 않습니다.

원격 컴퓨터에서이 독립 실행 형 jar를 실행해야하므로 jar이 만들어 질 때 모든 종속 라이브러리가이 jar 안에 패키징되어야합니다.

아이디어가 있으시면 제안 해주십시오. 감사합니다

+0

어떤 종류의 서버에 대해 이야기하고 있습니까? JBoss/Tomcat/GLassfish? – khmarbaise

+0

서버가 jBoss입니다. – Gendaful

답변

1

그것은 당신이 독립 실행 형 실행 파일 병을 만들려고하는 것 같습니다. 단순히

  1. unpack dependencies :

    가 그렇게 여러 가지 방법이 있습니다 제가 몇 가지를 나열하자 - 은 (?이 청소기를 확인하시기 바랍니다 또는 하나 개의 파일 내부의 종속성을 수행하는 기본 목표입니다) ${project.build.outputDirectory}로 - 자원을 해결하는

  2. 사용 onejar-maven-plugin을 충돌 간단한 경우 거의 같은에만
  3. 사용 maven-shade-plugin 만에 종속 항아리가 int로 내장 된 차 항아리 O 및 사용자 정의 클래스 로더와 발사기는

당신의 조각이

을 (maven-jar-pluginshaded*transformers 속성을 지원하지 않기 때문에) 처음 두 접근 방식 의 잘못된 혼합물 것으로 보인다 실행 생성 일부 프레임 워크는 사용중인 라이브러리를 나열하기 위해 클래스 경로를 검사하기 때문에 어떤 경우에는 처음 두 개를 사용할 수 없으므로 많은 매니 페스트가 하나의 라이브러리로 축소됩니다.

대부분 세 번째가 정상적으로 작동합니다. 그것은 수정되지 않은 원래의 jar 파일을 포함하고 있기 때문에 필자가 가장 좋아합니다. 특히 불안정한 라이브러리를 실험 할 때 결과에 ​​더 확신을 갖게합니다.

+0

도움을 주셔서 감사합니다. – Gendaful

관련 문제