Maven Assembly插件:资源在jar的根目录下复制

时间:2017-09-11 12:16:30

标签: java maven jar

我使用 maven-assembly-plugin 构建 Java 8 项目,并将其打包为 JAR 文件

我在src/main/resources(通常的maven资源目录)中获得了多个资源。 创建JAR时,src/main/resources下的所有资源文件都将复制到JAR的根目录。

在代码中,我尝试使用位于FileInputStream中的src/main/resources来打开文件,并且在运行项目时它运行良好而不将其打包为JAR文件。但是,当我从JAR文件运行项目时,我得到了很多FileNotFoundException,因为我的资源不再是src/main/resources,而是${project.basedir}

我希望它们位于JAR文件中的src/main/resources。有可能吗?

我的构建配置如下:

   <build>
        <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>

        <plugins>
            <plugin>
                <!-- Build an executable JAR -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.0.2</version>
                <configuration>
                    <archive>

                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>EmployProject.TestAlgo</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>

            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>

                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>TestAlgo</mainClass>
                        </manifest>
                    </archive>

                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>

        </plugins>

        <resources>
            <resource>
                <directory>${project.basedir}/src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>

    </build>

修改

如果不可能,我的代码中应该使用什么来访问我的资源文件?

1 个答案:

答案 0 :(得分:1)

感谢@khmarbaise和这篇文章:Accessing a Java Resource as a File

我发现我使用了错误的API来打开资源。 JAR中的资源不是文件,因此我改变了:

XMLDecoder xmlDec = new XMLDecoder(new InputFileStream(this.getClass().getResourceAsStream(fileName))

为:

InputStream in = EnumTools.class.getResourceAsStream(fileName);
XMLDecoder decoder = new XMLDecoder(in);