【发布时间】:2016-11-08 12:27:53
【问题描述】:
我正在尝试使用 maven-assembly-plugin 构建可执行 jar (uberjar)。该项目使用HK2作为依赖注入的提供者。
@Services 定义在项目中以及一些依赖项中。 HK2 服务定位器从inhabitant files 填充到META-INF/hk2-locator/default,在编译/构建时生成。我正在使用hk2-metadata-generator。
我的问题是默认组装策略jar-with-dependencies 在构建 jar 之前解压缩所有内容。这会用最后解压的内容覆盖META-INF/hk2-locator/default...结果,服务定位器无法找到所有服务。
我探索了不同的解决方案,并正在寻找最佳解决方案的指导。
1.在组装期间聚合不同的居民文件
我创建了一个程序集描述符,将所有居民文件合并为一个:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
<id>uberjar</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<containerDescriptorHandlers>
<!-- remove this element and the following file-aggregator generates an empty file -->
<!-- see https://issues.apache.org/jira/browse/MASSEMBLY-815 -->
<containerDescriptorHandler>
<handlerName>metaInf-services</handlerName>
</containerDescriptorHandler>
<containerDescriptorHandler>
<handlerName>file-aggregator</handlerName>
<configuration>
<filePattern>META-INF/hk2-locator/default</filePattern>
<outputPath>META-INF/hk2-locator/default</outputPath>
</configuration>
</containerDescriptorHandler>
</containerDescriptorHandlers>
<dependencySets>
<dependencySet>
<unpack>true</unpack>
<scope>runtime</scope>
<useProjectArtifact>true</useProjectArtifact>
</dependencySet>
</dependencySets>
</assembly>
除了组装插件中的愚蠢错误之外,这会产生一个看起来不错的组合居民文件。然而,当我要求服务定位器转储它的描述符时,我的项目的服务被检测到了好几次。我不知道这是否是个问题,尤其是对于单例服务。
2。不要解压依赖项
这背后的想法是将依赖项留在他们自己的 jar 文件中,而不是接触他们的 META-INF 文件。我按照this post 构建了jar,但我遇到了类加载问题:尽管MANIFEST.MF 在类路径中指定了jar,但无法加载依赖项。
如果我能修复类加载,这感觉是最干净的解决方案。
3。使用运行时发现而不是驻留文件
This solution 也很有希望。问题是它不适用于我使用 hk2-testng 的测试(我不明白这里有什么不同)。
如果您对个别解决方案或如何最好地进行建议有任何建议,我很高兴收到您的来信。
【问题讨论】:
-
我会选择#1。我们一直使用这种解决方案。 第四个选项是在最后完成的 jar 上运行 hk2-inhabitant-generator。如果您选择类而不是将所有内容放入一个 jar 中,并且您希望该 jar 的元数据文件保证正确,则第四个选项特别好
标签: java maven-assembly-plugin hk2