2015-04-03 120 views
0

部分阴影运行的JAR我有一个部署环境中,我有以下目录结构:生成与Maven

+--runnable.jar 
+--thirdparty_lib 
    +-- a.jar 
    +-- b.jar 
    +-- c.jar 

这工作进行的顺利,因为我们有相当频繁地展开时,却罕见thirdparty_lib更新(在那里是一个很大的数字,需要很长一段时间)。 [向前看,这个结构和部署系统不成立,但这是我们现在所拥有的,不想改变它]

runnable.jar中的代码是从多个项目的eclipse中生成的(包括一些共享内部库)。

我已经为我们的每个项目创建了一个Maven模块以管理内部和第三方依赖关系。我创建的生成

+--runnable.jar 
+--lib 
    +-- a.jar 
    +-- b.jar 
    +-- c.jar 
    +-- internaldependency1.jar 
    +-- internaldependency2.jar 

此运行良好,但这意味着更新上部署的所有internaldependencies初始构建配置(使用maven-JAR-插件和行家依赖性-插件)。

所以我想在runnable.jar中包含一些.jar文件,以便快速部署,其他人在thirdparty_lib文件夹中,这样不需要经常部署。

我遇到了几个问题,并有一个试探性的解决方案,概述为下面的答案,但它似乎过于复杂。

回答

0

我的解决方案需要三个部分

  • 使用Maven遮阳帘插件包括内部的依赖罐子在runnable.jar
  • 使用Maven的依赖,插件复制依赖抄袭他人的依赖
  • 在runnable.jar的清单中设置正确的类路径

前两部分非常简单。 Maven的遮阳帘插件的配置需要

<configuration> 
    ... 
    <artifactSet> 
    <includes> 
     <include>INTERNAL_GROUP</include> 
    </includes> 
    </artifactSet> 
</configuration> 

的配置Maven的依赖关系的插件:复制依赖

<configuration> 
    <outputDirectory>thirdparty_lib</outputDirectory> 
    <excludeGroupIds>INTERNAL_GROUP</excludeGroupIds> 
</configuration> 

但设置classpath中证明了具有挑战性的。在可运行jar清单中不允许使用通配符。这两个文件夹都不是光盘名称。以前,maven-jar-plugin从依赖关系生成类路径,但现在...?我发现maven-dependency-plugin:build-classpath在创建我想要的类路径方面做得很好,但是接受了一个不能为空字符串的pathSeparator(我试过的所有变体在生成Effective时删除了空格POM)。然后,我可以将其输出到运行时属性(除了jar清单的错误分隔符,它需要路径之间的空格)。

<configuration> 
    <prefix>thirdparty_lib</prefix> 
    <pathSeparator>:</pathSeparator> 
    <outputProperty>CLASSPATH_WITH_WRONG_SEPARATOR</outputProperty> 
    <excludeGroupIds>INTERNAL_GROUP </excludeGroupIds> 
</configuration> 

我解决了这个,而用粗暴gmaven-插件

<configuration> 
    <source> 
    project.properties.setProperty(
     'CLASSPATH_WITH_SPACES', 
     project.properties.CLASSPATH_WITH_WRONG_SEPARATOR.replace(':', ' ') 
    ) 
    </source> 
</configuration> 

并添加以下条目行家遮阳帘插件配置

<transformers> 
    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
    <manifestEntries> 
    <Main-Class>MAIN</Main-Class> 
    <Class-Path>${CLASSPATH_WITH_SPACES}</Class-Path> 
    </manifestEntries> 
    </transformer> 
</transformers>