hk2 居民文件正在被 uber-jar 程序集覆盖
hk2 inhabitant files are being overwritten by uber-jar assembly
我正在尝试使用 maven-assembly-plugin
构建可执行 jar (uberjar)。该项目使用 HK2 作为依赖注入的提供者。
@Service
s 在项目以及一些依赖项中定义。 HK2 服务定位器从 inhabitant files 在 META-INF/hk2-locator/default
填充,在 compile/build 时间生成。我正在使用 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 可以工作。我们在将完整模块放在一起时使用该选项
您还可以选择第四个选项,即 运行 hk2-inhabitant-generator 在完成的罐子上作为最后一步,例如:
java org.jvnet.hk2.generator.HabitatGenerator --file *my-uber.jar*
当您 运行 HabitatGenerator 时,它会扫描 jar 中的所有文件,并将 META-INF/hk2-locator/default
文件添加到包含所有 hk2 服务的 jar 中。
如果您的 uber jar 是其他 jar 的一部分而不是整个东西,这是一个更好的选择,因为它保证更准确(它不会包含 uber jar 中没有的服务)
我正在尝试使用 maven-assembly-plugin
构建可执行 jar (uberjar)。该项目使用 HK2 作为依赖注入的提供者。
@Service
s 在项目以及一些依赖项中定义。 HK2 服务定位器从 inhabitant files 在 META-INF/hk2-locator/default
填充,在 compile/build 时间生成。我正在使用 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 可以工作。我们在将完整模块放在一起时使用该选项
您还可以选择第四个选项,即 运行 hk2-inhabitant-generator 在完成的罐子上作为最后一步,例如:
java org.jvnet.hk2.generator.HabitatGenerator --file *my-uber.jar*
当您 运行 HabitatGenerator 时,它会扫描 jar 中的所有文件,并将 META-INF/hk2-locator/default
文件添加到包含所有 hk2 服务的 jar 中。
如果您的 uber jar 是其他 jar 的一部分而不是整个东西,这是一个更好的选择,因为它保证更准确(它不会包含 uber jar 中没有的服务)