hk2居民文件被uber-jar程序集覆盖

时间:2016-07-06 12:39:41

标签: java maven-assembly-plugin hk2

我正在尝试使用maven-assembly-plugin构建可执行jar( uberjar )。该项目使用HK2作为依赖注入的提供者。

@Service在项目中以及在某些依赖项中定义。 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对我的测试不起作用(我不明白这里有什么不同)。

如果您对个别解决方案有所建议或如何最好地继续,我很高兴收到您的回复。

2 个答案:

答案 0 :(得分:2)

您还可以使用第四个选项,即在完成的jar上运行hk2-inhabitant-generator作为最后一步,例如:

java org.jvnet.hk2.generator.HabitatGenerator --file *my-uber.jar*

当您运行HabitatGenerator时,它将扫描jar中的所有文件,并将jar中的META-INF/hk2-locator/default文件添加到所有hk2服务中。

如果您的超级罐是其他罐子的零件和碎片而不是整个罐子,这是一个更好的选择,因为它保证更准确(它不包含不在超级罐中的服务)

答案 1 :(得分:1)

HK2居民文件设计为在连接在一起时正常工作,因此上面的选项#1有效。我们在将完整模块放在一起时使用该选项