maven打包为jar项目,如何通过pom配置把resources文件夹在打包时弄到jar包同级目录下?

maven打包jar项目后,所有的文件都在jar包,这样做修改配置文件比较麻烦。

因此我不想把src/main/resources弄到jar包内,而是弄到jar包外面,也就是和jar包相同目录下。打包后,对resources文件夹下配置文件读取的java代码,打包前和打包后运行依然没有问题。

假若有一个方法调用过程中,会读取resources里的test.txt文件的内容输出到控制台上,打包前与打包后,调用方法的过程中,不能出现“test.txt文件不存在、找不到test.txt文件之类”的的异常。并且打包后,如果修改test.txt的内容,启动jar后,读取test.txt输出的内容也会发生改变。

如果做不到以上要求,我还不如自己来自定义配置文件的读取路径的工具类,那这样的话resources文件夹放配置文件就毫无意义了。因为有些框架会把配置文件默认设置在resources文件夹下,比如logback,log4j2日志框架的配置文件默认读取路径会在src/main/resources下,不能做到的话,考虑到线上运行前,可能会修改日志框架的配置文件,就只能自定义logback、log4j2的读取指定配置文件的路径了。

比如假设打包后的jar包名为dome.js

则打包后目录下的文件是
dome.jar
resources文件夹,

就算打包后只有demo.jar包文件,打包后把resources文件夹手动复制到dome.jar所在目录下,控制台输出的信息能成功显示读取resource文件夹的内容也可以。

如何通过配置pom.xml做到?

阅读 10.4k
2 个回答

楼上@gg22g2 的思路没问题的,就是得稍加改造一下:

先在 resource里排除你的所有文件(**/**不是**/*.*):

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <excludes>
            <exclude>**/**</exclude>
        </excludes>
    </resource>
</resources>

然后配置下 resource 插件,使用它的copy-resources goal来完成你的复制工作(插件版本看你的maven版本自行调整):

<plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.6</version>

    <executions>
        <execution>
            <id>copy-resources</id>
            <phase>package</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
            <!-- 你需要的输出路径,现在是配置输出在 target/resources -->
                <outputDirectory>${build.directory}/resources</outputDirectory>
                <resources>
                    <resource> 
                            <directory>src/main/resources</directory>
                        </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
</plugin>

最后正常 clean package 就可以了,如果有帮助请关注支持一下

我搜索了一下,也没有找到直接配置pom的方式。我想到的方式时你在打包时排除resources中所有内容

        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <excludes>
                    <exclude>**/*.*</exclude>
                </excludes>
                <filtering>false</filtering>
            </resource>
        </resources>

通过手工操作,在jar所在目录也有一份resource。然后在启动时使用 -classpath 追加上resource所在目录。

刚刚试了试,以jar包方式运行时,-classpath配置的路径是不起作用的。我参考了一篇文章,可以使用:

-Xbootclasspath/a:

比如:java -Xbootclasspath/a:D:\kaifa_environment\code\abc -jar yourJarExe.jar

我查资料,尝试可能的解决办法。你就是试一试我的方法,也不会再强调这些东西。你无非是想要把resources放到jar外部后,在不修改代码中一些资源路径的情况下,仍然可以读取到resources中内容。这也是我说的为啥要用-classpath追加上resource所在目录。如果是jar包的话,classpath参数无效,改成Xbootclasspath参数。我不知道你是尝试了不起作用还是什么。建议看一下Class.getResource方法逻辑和classpath用处。

我写这么多,我不知道你是试了我的方法后才重新修改的问题,还是看过我的办法就去修改问题了。我要是随便写个内容糊弄你,我就认了。但是认真帮你想办法,你理都不理,你觉得别人帮你都是应该的吗?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题