当前位置: 首页 > 面试题库 >

使用依赖项的资源?

宓博实
2023-03-14
问题内容

在我的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

当然,这会使事情变得复杂,因为我期望JAR本身位于类路径中,而不是JAR所在的目录中

有什么建议?

回到这个项目,我仍然有这个问题。其他指南也讨论了如何使用maven-assembly-
plugin和远程资源插件,但这很麻烦,因为所有模块都必须包含Monster插件XML。

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

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

这应该足够简单,但是我该怎么做呢?我已经花了数小时试图找出一种简单而干净的方法,但无济于事。


问题答案:

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

我的解决方案采用了核心模块,并使用Maven Dependency Plugin解压缩,确保排除META-
INF文件夹和org文件夹(已编译类所在的位置)。我之所以要排除我不想要的东西,而不是明确说明我想要的东西,是因为可以轻松添加新资源,而不必一直更新我的POM。

我之所以不使用Assembly插件或Remote
Resources插件,是因为它们使用了专用的资源模块。我认为我不必制作一个核心模块和一个核心资源模块,而核心资源模块仅包含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>


 类似资料:
  • 4.6 资源依赖 如果bean本身将通过某种动态过程来确定和提供资源路径,那么bean可以使用ResourceLoader接口来加载资源。 j假设以某种方式加载一个模板,其中需要的特定资源取决于用户的角色。 如果资源是静态的,那么完全消除ResourceLoader接口的使用是有意义的,只需让bean公开它需要的Resource属性,那么它们就会以你所期望的方式被注入。 什么使得它们轻松注入这些属

  • 我给ivy添加了一个依赖项(我们称之为a)。在maven central中具有pom文件的xml。Ivy使用ibiblio来解析maven依赖项。添加到常春藤中的依赖项(A)。xml具有可传递依赖项(B)。到目前为止,一切都很好。传递依赖(B)的依赖(C)不能用常春藤来解决。 我在常春藤上定义了一个新的名字。如下所示的xml: 在B的pom文件中,C在编译和测试范围中定义如下: 当我在ivy的缓存

  • 我们有一个使用Spring Boot编写的新项目,其中我们使用Log4j2进行日志记录。 问题是我们需要使用一个遗留库,我们拥有它,但我们不能改变;其他几个系统使用它,我们不能通过改变所有这些系统来扩大我们的范围。 当我们的项目运行时,它使用Log4j2记录的很好,但是当我们调用遗留库时,它会调用Log4j,从而抛出异常。 在我们使用log4j2的新应用程序中,有没有办法处理旧的log4j调用?

  • 最近,我发现了以下问题: 当我为我的项目设置依赖项管理时,我有一个child-pom,它使用具有依赖项的插件,我想要与在我的依赖项管理中声明的依赖项同步。 在根pom中,我在依赖项管理中声明: 在子pom中,我有一个插件需要gwt-user: 但是,如果我移除gwt-maven-plugin中使用的依赖版本,编译就会失败。 是不是还有别的办法可以实现呢? PS:在maven和maven插件中有一个