2012-11-12 92 views
0

BackGround:我正在使用Spring和Maven构建独立应用程序。 我想从我的应用程序创建一个jar,所以我可以将它部署在远程服务器上并对其进行测试。如何使用maven打包jar中的依赖关系?

我面临着以下问题,

(1)当我出口这个罐子是可执行的JAR通日食,我得到异常的下方。

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文件命名冲突上述问题,所以,我想创建一个使用插件在Maven中像下面一个罐子。

<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

看来你正在尝试创建独立的可执行jar。 (或者,是你随身携带一个文件里面的依赖关系的首要目标 - 请让这个 清洁?)

有几种方法可以做到这一点,让我列举一些:

  1. 简单unpack dependencies${project.build.outputDirectory} - 简单的情况下,只有
  2. 使用maven-shade-plugin大致相同的,但解决资源冲突
  3. 使用onejar-maven-plugin中嵌入的依赖罐子诠释Ø主缸,并创建启动自定义类加载器来运行它

你的片段似乎是前两种方法的一个无效的混合物(因为maven-jar-plugin不支持shaded*transformers属性)

请注意,在某些情况下,不能使用前两个 - 因为某些框架会扫描类路径以列出正在使用的库,并且这些框架正在将许多清单减少为一个。

大多数情况下,第三个工作正常。这也是我的最爱,因为它包含了未修改的原始罐子,这让我对结果更加自信,特别是在试验不稳定的库时。

+0

感谢您的帮助。 – Gendaful