博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Boot获取jar包内资源文件
阅读量:7029 次
发布时间:2019-06-28

本文共 2869 字,大约阅读时间需要 9 分钟。

在Spring Boot多模块项目中,A模块是主模块,依赖B模块,如下图1所示,

在对A模块做打包操作之后 A.jar包可以通过 java -jar -Dspring.profiles.active=dev A.jar 运行,

对A模版的jar文件A.jar解压之后,会看到如下图所示的文件结构,B模块会作为A模块的依赖模块放在lib目录下,当然,其他B模块所依赖的jar都在这个目录。

对B模块的jar文件B.jar解压,那B模块编译前的配置文件resources目录的内容也在自己jar包内,如下图2。

                                                            图1 

               图2

在IDEA项目中(未打成jar包),可以直接通过getResource拿到资源文件路径,然后通过File file = new File(path) 加载文件

String path = BohaiQueryProvider.class.getClassLoader().getResource(keyFilePath).getPath()
public URL getResource(String name) {        URL url;        if (parent != null) {            url = parent.getResource(name);        } else {            url = getBootstrapResource(name);        }        if (url == null) {            url = findResource(name);        }        return url;    }

但是打成jar包之后,不能通过这种方式获取依赖jar包的文件了,File文件加载路径内文件会找不到,那怎样做呢?

InputStream inputStream = BohaiQueryProvider.class.getResourceAsStream(keyFilePath)byte[] prifileContent = IOUtils.toByteArray(inputStream)

通过 getResourceAsStream方式拿到资源文件,其实 getResourceAsStream函数也是先通过 getResource拿到资源的URL,然后通过流的形式拿到文件

public InputStream getResourceAsStream(String name) {        URL url = getResource(name);        try {            return url != null ? url.openStream() : null;        } catch (IOException e) {            return null;        }}

附上stackoverflow上的一个问题 https://stackoverflow.com/questions/2815404/load-properties-file-in-jar

问题大致是

getSystemResourceAsStream这个函数在单元测试和Eclipse中运行可以,但是打成jar包作为被别的包依赖的jar出现问题

原因是 getSystemResourceAsStream 在web项目中是会去你的系统classpath加载资源,例如你配置的jdk目录,而web项目 servlet容器,例如tomcat会将应用的classpath和系统的做区分,最简单的加载资源的方式是直接用资源所在jar包里的类加载器加载

MyClass.class.getResourceAsStream("/someProps.properties")

另外二个小知识点

The following rules cover about 95% of the decisions that application developers and deployers must make about where to place class and resource files to make them available to web applications:

  • For classes and resources specific to a particular web application, place unpacked classes and resources under /WEB-INF/classes of your web application archive, or place JAR files containing those classes and resources under /WEB-INF/lib of your web application archive.
  • For classes and resources that must be shared across all web applications, place unpacked classes and resources under $CATALINA_BASE/shared/classes, or place JAR files containing those classes and resources under $CATALINA_BASE/shared/lib.

对于web应用,应该将资源文件和类放在/WEB-INF/classes中,对于多个web应用公用的类,放置在$CATALINA_BASE/shared/classes中。

Maven启动指定Profile通过-P,如mvn spring-boot:run -Ptest,但这是Maven的Profile。

如果要指定spring-boot的spring.profiles.active,spring-boot 1.x 使用mvn spring-boot:run -Drun.profiles=test,spring-boot 2.x 使用mvn spring-boot:run -Dspring-boot.run.profiles=test。参考资料:

如果使用命令行直接运行jar文件,则使用java -jar -Dspring.profiles.active=test demo-0.0.1-SNAPSHOT.jar

如果使用开发工具,运行Application.java文件启动,则增加参数--spring.profiles.active=test

转载于:https://www.cnblogs.com/zhengwangzw/p/9960632.html

你可能感兴趣的文章
jquery源码分析(二)——架构设计
查看>>
bzoj1935 [SHOI2007]Tree 园丁的烦恼
查看>>
javascript深入理解js闭包(转)
查看>>
207. Course Schedule
查看>>
如何优化您的 Android 应用 (Go 版)
查看>>
crossplatform---Nodejs in Visual Studio Code 01.简单介绍Nodejs
查看>>
UEditor富文本编辑框学习
查看>>
Trie树实现
查看>>
Opencv无法调用cvCaptureFromCAM无法打开电脑自带摄像头
查看>>
Exception异常处理机制
查看>>
复杂的web---web中B/S网络架构
查看>>
编写文档的时候各种问题
查看>>
Eclipse里maven的project报Unbound classpath variable: 'M2_REPO/**/***/***.jar
查看>>
新旅程CSS 基础篇分享一
查看>>
查看内核函数调用的调试方法【原创】
查看>>
个人项目中遇到的问题
查看>>
byte与base64string的相互转化以及加密算法
查看>>
20145103 《Java程序设计》第3周学习总结
查看>>
J-19 集合对象
查看>>
转载 IOS开发之---static变量
查看>>