Java uber jar程序集正在覆盖hk2居民文件

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与上次解包的内容。。。因此,服务定位器无法找到所有服务 我已经探索了不同的解决方案,正在寻找哪一个是最好的指导 一,。在程序

我正在尝试使用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中,那么第四个选项尤其好