使用依赖项的资源?
在我的Maven项目中,有一个模块(核心),它的类有一些资源。 当在模块内部运行类时,它能够获得自己的资源。 一切正常。
在东西中断的时候,依赖于核心的另一个模块试图运行该类。 Java正在寻找资源的文件夹是这个模块,而不是核心模块。 所以课程失败了。
简而言之:如何访问依赖项的资源?
我试图通过在Core的JAR Manifest Class-Path: .
声明来尝试这样做Class-Path: .
。 但是在列出JSHookLoader.class.getClassLoader().getResources("");
可用资源时JSHookLoader.class.getClassLoader().getResources("");
(如果有任何意义,JSHookLoader在Core中),我得到:
Resource: W:\programming\quackbot-hg\impl\target\classes File rebel.xml Resource: W:\programming\maven-repo\org\quackbot\core\3.5-SNAPSHOT File core-3.5-SNAPSHOT.jar File core-3.5-SNAPSHOT.pom File maven-metadata-local.xml File _maven.repositories
这当然使事情复杂化,因为我期望JAR本身在Classpath中,而不是JAR所在的目录
有什么建议么?
回到这个项目,我仍然有这个问题。 其他指南已经讨论过使用maven-assembly-plugin和远程资源插件,但这很麻烦,因为所有模块都必须包含怪物插件XML。
为什么我不简化问题:如何将依赖JAR添加到资源列表?
- core.jar在文件夹/ resources下有一些资源。 运行core.jar我可以在资源列表中看到/ resources。
- impl.jar取决于core.jar。 运行它/资源不在资源列表中,因此造成破坏。
这应该很简单,但我该怎么做呢? 我花了好几个小时试图找出一个简单干净的方法去做,但无济于事。
经过大量的搜索,我终于偶然发现了一个解决方案。
我的解决方案采用核心模块并使用Maven Dependency Plugin解压缩,确保排除META-INF文件夹和编译类所在的org文件夹。 我排除我不想要的东西而不是明确说明我想要的东西的原因是这样可以轻松添加新资源,而不必一直更新我的POM。
我没有使用程序集插件或远程资源插件的原因是因为它们使用专用资源模块。 我认为我不应该制作核心模块和核心资源模块,核心资源模块只包含logback和hibernate配置文件+其他一些东西。
这是我用来做这件事的副本
org.apache.maven.plugins maven-dependency-plugin 2.2 unpack generate-resources unpack-dependencies ${project.groupId} core true true ${project.build.directory}/core-resources org/**,META-INF/**,rebel.xml true true false ${project.build.directory}/core-resources false ${basedir}/src/main/resources
如果资源位于/src/main/resources
并且 JAR中的类正在使用getResourceAsStream()
访问它们,那么您应该能够从其他JAR中的类访问这些文件(也使用getResourceAsStream()
)。 这是因为位于/src/main/resources
所有文件最终都位于同一逻辑目录( CLASSPATH
)中。 换句话说:位于/src/main/resources
所有文件以及从/src/main/java
编译的所有类都可以说合并到一个命名空间中。
如果您仍然无法访问文件,即使所有类都使用统一的getResourceAsStream()
API,您可能会遇到一些类加载可见性问题。
如果您的从属JAR有一个名为OneDependent的类,那么这应该有效:
OneDependent.class.getResourceAsStream(resourcePath)
我不认为这是个好主意。 假设你有模块A
它取决于’B’。 ‘B’取决于C
基本上,你应该只关心B
模块的接口。 也许,明天它会改变从C
到D
依赖。 如果它发生,你将需要改变A
这不是好情况,是吗? 因此,以隐式方式从C
声明依赖关系A
简而言之:如何访问依赖项的资源?
简而言之:直接声明这种依赖性。
我刚才有类似的情况。 我有一个“测试代码构建器”,它从src / test / resources目录中获取数据并将数据泵入H2数据库。 从模块A可以正常工作,但是当从模块B调用它时没有。 它构造一个具有多个分号的路径(由于资源在jar文件中); 然后,moduleA无法找到“本地自身”的文件。
最后,我补充说
src/test/resources ../moduleA/src/test/resources
到moduleB的构建部分,现在构建运行正常并且符合预期。