使用依赖项的资源?

The*_*eLQ 29 java maven

在我的Maven项目中,有一个模块(核心),它的类有一些资源.当在模块内部运行类时,它能够获得自己的资源.一切正常.

东西断裂的地方是依赖核心的另一个模块试图运行该类.Java正在寻找资源的文件夹是这个模块,而不是核心模块.所以课程失败了.

简而言之:如何访问依赖项的资源?


我试图通过在Core的JAR Manifest中声明来尝试这样做Class-Path: ..但是当列出可用的资源时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
Run Code Online (Sandbox Code Playgroud)

这当然使事情复杂化,因为我期望JAR本身位于Classpath中,而不是JAR所在的目录

有什么建议?


回到这个项目,我仍然有这个问题.其他指南已经讨论过使用maven-assembly-plugin和远程资源插件,但这很麻烦,因为所有模块都必须包含怪物插件XML.

为什么我不简化问题:如何将依赖JAR添加到资源列表?

  1. core.jar在文件夹/ resources下有一些资源.运行core.jar我可以在资源列表中看到/ resources.
  2. impl.jar取决于core.jar.在运行它时/资源不在资源列表中,因此造成严重破坏.

这应该很简单,但我该怎么做呢?我花了好几个小时试图想出一个简单干净的方法去做,但无济于事.

The*_*eLQ 32

经过大量的搜索,我终于偶然发现了一个解决方案.

我的解决方案采用核心模块并使用Maven Dependency Plugin解压缩,确保排除META-INF文件夹和编译类所在的org文件夹.我排除我不想要的东西而不是明确说明我想要的东西的原因是这样可以轻松添加新资源而无需我不断更新我的POM.

我没有使用程序集插件或远程资源插件的原因是因为它们使用专用资源模块.我认为我不应该制作核心模块和核心资源模块,核心资源模块只包含logback和hibernate配置文件+其他一些东西.

这是我用来做这件事的副本

    <build>
        <plugins>
            <!--Extract core's resources-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.2</version>
                <executions>
                    <execution>
                        <id>unpack</id>
                        <phase>generate-resources</phase>
                        <goals>
                            <goal>unpack-dependencies</goal>
                        </goals>
                        <configuration>
                            <includeGroupIds>${project.groupId}</includeGroupIds>
                            <includeArtifactIds>core</includeArtifactIds>
                            <excludeTransitive>true</excludeTransitive>
                            <overWrite>true</overWrite>
                            <outputDirectory>${project.build.directory}/core-resources</outputDirectory>
                            <excludes>org/**,META-INF/**,rebel.xml</excludes>
                            <overWriteReleases>true</overWriteReleases>
                            <overWriteSnapshots>true</overWriteSnapshots>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <!--New resource locations-->
        <resources>
            <resource>
                <filtering>false</filtering>
                <directory>${project.build.directory}/core-resources</directory>
            </resource>
            <resource>
                <filtering>false</filtering>
                <directory>${basedir}/src/main/resources</directory>
            </resource>
        </resources>
    </build> 
Run Code Online (Sandbox Code Playgroud)


Tom*_*icz 6

如果资源位于JAR 中/src/main/resources JAR中的类正在使用它们getResourceAsStream(),则您应该能够从其他JAR中的类访问这些文件(也使用getResourceAsStream()).这是因为位于/src/main/resources最终的所有文件都位于同一逻辑目录(CLASSPATH)中.换句话说:所有位于其中的文件/src/main/resources和从中编译的所有类/src/main/java都可以说合并到一个命名空间中.

如果即使所有类都使用统一getResourceAsStream()API 仍然无法访问文件,您可能会遇到一些类加载可见性问题.

  • 请参阅我的问题中的更新,它不能像你说的那样工作. (2认同)