Java uber jar程序集正在覆盖hk2居民文件
我正在尝试使用maven汇编插件构建一个可执行的jar。项目将用作依赖项注入的提供程序 @服务在项目以及一些依赖项中定义。HK2服务定位器由编译/构建时生成的at META-INF/HK2 locator/default填充。我正在使用hk2元数据生成器 我的问题是默认的组装策略在构建jar之前会解包所有内容。这将覆盖META-INF/hk2 locator/default与上次解包的内容。。。因此,服务定位器无法找到所有服务 我已经探索了不同的解决方案,正在寻找哪一个是最好的指导 一,。在程序集期间聚合不同的驻留文件 我创建了一个程序集描述符,它将所有驻留文件合并为一个:Java uber jar程序集正在覆盖hk2居民文件,java,maven-assembly-plugin,hk2,Java,Maven Assembly Plugin,Hk2,我正在尝试使用maven汇编插件构建一个可执行的jar。项目将用作依赖项注入的提供程序 @服务在项目以及一些依赖项中定义。HK2服务定位器由编译/构建时生成的at META-INF/HK2 locator/default填充。我正在使用hk2元数据生成器 我的问题是默认的组装策略在构建jar之前会解包所有内容。这将覆盖META-INF/hk2 locator/default与上次解包的内容。。。因此,服务定位器无法找到所有服务 我已经探索了不同的解决方案,正在寻找哪一个是最好的指导 一,。在程序
<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>
除了汇编插件中的愚蠢错误外,这还导致了一个看起来不错的组合驻留文件。然而,当我要求服务定位器转储其描述符时,我的项目的服务会被检测到好几次。我不知道这是否是一个问题,特别是对于单身服务
二,。不要解压缩依赖项
这背后的想法是将依赖项保留在它们自己的jar文件中,而不是接触它们的META INF文件。我随后构建了jar,但我遇到了类加载问题:尽管MANIFEST.MF在类路径中指定了jar,但无法加载依赖项
这感觉像是最干净的解决方案,只要我能修复类加载
三,。使用运行时发现而不是驻留文件
也很有希望。问题是它不适用于我使用HK2TestNG进行的测试,我不明白这里有什么不同
如果您对个别解决方案或如何最好地继续进行有任何建议,我很高兴收到您的来信。HK2居民文件设计为在连接在一起时可以正常工作,因此上述选项1可以工作。我们在将完整模块组合在一起时使用该选项HK2居民文件设计为在连接在一起时可以正常工作,因此上面的选项1可以工作。我们在将完整模块组合在一起时使用该选项,您还可以使用第四个选项,即在完成的jar上运行,作为最后一步,类似于:
java org.jvnet.hk2.generator.HabitatGenerator --file *my-uber.jar*
当您像这样运行HabitatGenerator时,它将扫描jar中的所有文件,并将META-INF/hk2 locator/default文件与所有hk2服务一起添加到jar中
如果您的uber jar是其他jar的一部分而不是整个jar,那么这是一个更好的选择,因为它保证更准确,它不会包含uber jar中没有的服务
java org.jvnet.hk2.generator.HabitatGenerator --file *my-uber.jar*
当您像这样运行HabitatGenerator时,它将扫描jar中的所有文件,并将META-INF/hk2 locator/default文件与所有hk2服务一起添加到jar中
如果你的uber jar是其他jar的一部分,而不是整个jar,那么这是一个更好的选择,因为它保证更准确,不会包含uber jar中没有的服务。我们一直在使用这种解决方案。第四个选项是在最后完成的罐子上运行hk2居民生成器。第四个选项特别好,如果您不只是将所有内容都放在一个jar中,而是选择类,并且希望为该jarI提供一个保证正确的元数据文件。我们一直在使用这种解决方案。第四个选项是在最后完成的罐子上运行hk2居民生成器。如果您正在挑选类,并且希望为该jar提供一个保证正确的元数据文件,而不是将所有内容都放在一个jar中,那么第四个选项尤其好