如何使用Maven将依赖文件(放入目标)包含到Java代码中?

问题描述 投票:0回答:1

我有点陷入困境,因为我不确定自己是不是正确的道路。

目前,我有多个项目 - 一个项目,分发包含XML文件和JSON文件等几个其他文件的.zip文件。这已经在我们正在使用的Maven本地存储库中,目前不是问题。

问题是现在我们有另一个项目需要在编译和运行时使用这个文件。因此,我们需要将其作为资源加载。但是,在jar中包含以下文件:

                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-scripts</id>
                        <phase>compile</phase>
                        <goals>
                            <goal>unpack</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>target</outputDirectory>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>mygroupidhere</groupId>
                                    <artifactId>myartifacthere</artifactId>
                                    <version>myversionhere</version>
                                    <overWrite>true</overWrite>
                                    <classifier>sources</classifier>
                                    <type>zip</type>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

确实将所需文件提取到目标/源,并将它们包含在构建jar的顶级目录中。但是,我正在努力使用它所在的项目中的Java代码来实际加载这些文件。这需要与构建(使用单元测试)以及运行时从jar文件(在jar,文件中)兼容被放置在源中/正如人们所期望的那样。

我已经尝试过使用Files.newInputStream(Paths.get("sources/examplefile")),但是单元测试失败了(此时,它位于target / sources / examplefile中,它可以工作,但显然在运行时不起作用,因为它只是在sources / examplefile中)。

我也尝试过类中的getResourcesAsStream,这在运行时是有意义的,但是在单元测试中不起作用,因为它将在目标中,因为它是从依赖项中获取的。单元测试必须直接与依赖项中的文件兼容(因此它们更像是集成测试),否则我们确实希望这个项目无法构建。

有谁知道答案?

java maven dependencies resources
1个回答
0
投票

这听起来像是一个糟糕的设计。

  1. 使用您的资源创建maven工件(jar文件),然后将其作为依赖项添加到项目中。其中也有一个简单的类文件(例如Loader)。
package something;
public class Loader(){
}
  1. 使用此类作为加载资源的起点:something.Loader.class.getClassLoader().getResourceAsStream("/<whatever>")
© www.soinside.com 2019 - 2024. All rights reserved.