【问题标题】:hk2 inhabitant files are being overwritten by uber-jar assemblyhk2 居民文件被 uber-jar 程序集覆盖
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    当你像这样运行 HabitatGenerator 时,它会扫描 jar 中的所有文件,并在 jar 中添加 META-INF/hk2-locator/default 文件和所有 hk2 服务。

    如果您的 uber jar 是其他 jar 的一部分而不是整个东西,这是一个更好的选择,因为它保证更准确(它不会包含不在 uber jar 中的服务)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-21
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 2020-02-01
      • 1970-01-01
      相关资源
      最近更新 更多