如何从多个项目访问公共资源文件



在我的一个项目中,我存储在/src/test/resources(典型的Maven目录结构)中的资源。这些资源正在项目中存储的公用事业类使用。

公用事业类本身是从其他项目中使用的(其他项目取决于这个项目)。我会访问这样的资源:

final InputStream inputStreamDobs = 
    ClassLoader.class.getResourceAsStream("/dbunit/clear_db.xml");

但是,由于我从不同的项目中使用它,所以路径不正确 - 它相对于current project that is being built/tested,而不是实用程序类和资源的路径。

有什么想法如何接近此问题?

我需要避免绝对路径 - 希望有一种定义实用程序类的相对路径的方法。

我也不想在多个项目上复制资源。欢呼。

编辑:为了给出一个上下文,我对XML文件中的表进行定义,在集成测试后需要清除(清晰的整个DB架构)。集成测试位于多个项目中,但是所有这些项目的清晰脚本和资源文件都相同,并且位于共同的父级项目中。

edit2:

奖励问题:我想访问常见的DTD文件(我们称其为tables.dtd),需要从其他多个项目从XML文件访问。(它将坐在共同的父项目中)。

目前,我对多个项目进行了重复,我使用指令从XML中提到它:

<!DOCTYPE dataset SYSTEM "src/test/resources/dbunit/dobs.dtd">

如何将其指向不同项目中的文件?

您写了

...但是,由于我从不同的项目中使用它,因此路径不正确 - 相对于当前的项目,它正在构建/测试,而不是公用事业类和资源是 ...

相对路径不是这里的问题。您在示例中使用绝对路径,但是即使您使用相对路径,也会指代包或目录结构。只要班级路径正确, getResourceAsStream就会捡起它们。真正的问题是您指的是另一个项目中的测试资源。但是,项目伪像中的测试资源和类并不包含,因此将它们从包括在内的模块中访问。如果您需要在多个项目中的测试中进行这些资源,我建议您使用src/main/resources中包含的这些恢复来创建一个新项目(假设" ProjectXyz-testResources"),并将其添加为具有范围"测试"的依赖性。<<<<<<<<。/p>

编辑为添加:

如果您不想将单独的项目用于测试资源,则可以使用目标jar:test-jar创建一个包含测试类和资源的测试JAR,并将其作为测试依赖性。您可能需要在POM中配置JAR插件以在常规构建上执行此目标。

您的Runtime class Path不应参考SRC/test/Resources。Maven将把所有内容复制到目标,因此您应该能够使用"/dbunit/clear_db.xml"

您是否尝试过使用" classpath:" 字首?如果在类路径上可用,则不必指定资源的完整途径。例如:

<mvc:resources location="classpath:/META-INF/web-resources/" mapping="/resources/**" />

/meta-inf/web-Resources/来自Spring MVC的JAR,这是该项目的依赖性之一。该项目不需要知道如何"直接"获得该资源,而是使用classpath。以此目的。如果您的项目是Web项目,您可以创建2个Web项目,其中一个包含配置文件,另一个项目是您的主要项目,现在您可以使用maven-war-plugin

覆盖项目

有很多类型的覆盖层,您可以访问此页面以获取更多信息maven-war-plugin覆盖

对于JAR文件,您可以将它们合并到单个maven-assembly-plugin

maven-semembly-plugin

我们有一个类似的实例,在该实例中,我们有一些配置文件,这些文件在大型多模块中使用了多个模块Maven项目。因此,我们所做的是将conf文件拆分为一个单独的模块,该模块只需将配置文件插入即可。然后,这些文件所需的任何内容都可以声明对配置文件模块的依赖关系,然后将JAR文件与配置文件一起使用,然后将其解压缩以使用它们。您可以为测试资源做类似的事情。创建一个仅用资源的模块,然后将它们放入相关路径中。

在这种情况下,我建议为此任务编程Maven插件,以便可以通过属性配置此变量路径。您还将从项目对象中受益。

/**
 * Location of the file.
 */
@Parameter(defaultValue = "${basedir}/src/main/java", property = "sourceFolder", required = true)
private File sourceFolder;
@Parameter(defaultValue = "${basedir}/src/test/java", property = "testFolder", required = true)
private File testFolder;
@Parameter(defaultValue = "${project}", property = "project", readonly = true, required = true)
private MavenProject project;

您可以尝试使用Maven覆盖层吗?过去,我们面临着类似的情况,并且使用叠加层解决了很多问题。通常,覆盖层用于在多个Web应用程序上共享共同资源。

也许是其中一种方法:

要么:您将XML文件和Java类(例如公用事业类)外包,需要将它们访问到单独的库中,然后您可以将其包含在其他几个项目中(很方便地作为Maven依赖项)。

或:您将这些XML文件放入单独的VCS-Tree或存储库中,然后将它们包含在项目树中(例如,在SVN中为"外部")。因此,您可以在项目中分开更新此参考,但是您只需要维护一个源文件。

最新更新