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

标签 java maven-assembly-plugin hk2

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

@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 的测试(而且我不明白这里有什么不同)。

<小时/>

如果您对个别解决方案或如何最好地进行有建议,我很高兴收到您的来信。

最佳答案

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

关于java - hk2 居民文件被 uber-jar 程序集覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38224248/

相关文章:

java - 我如何在 Jersey 中使用 supportsNullCreation()?

java - java.lang.NoSuchMethodError : javax. servlet.ServletContext.getEffectiveSessionTrackingModes()Ljava/util/Set;

java - @RequestMapping 未正确映射

java - Maven 程序集依赖程序集?

Maven 程序集插件。有什么方法可以直接从描述 rune 件中解压缩/解压缩存档,而不是依赖 antrun 插件?

java - 如何使用 Guice 注入(inject) HK2 beans

java - 如何在 Eclipse 中使用 PDFBox?是否打包成jar文件?

java - 不满意的依赖异常 : There was no object available for injection at SystemInjecteeImpl

maven - 从 maven 构建的 jar 运行 Apache Beam/Google Cloud Dataflow 作业

Java/Jersey - 使用 ParamInjectionResolver 创建自己的注入(inject)解析器 - 奇怪的行为