Springboot 项目一般是以 java -jar 形式运行的,解压后 BOOT-INF/lib 目录下有依赖的所有 jar 包。我的需求是不解压直接读取BOOT-INF/lib 下面的包。
参考这两篇文章后找到了解决方案,代码如下:
SpringBoot项目读取依赖jar包中的文件https://blog.csdn.net/songzehao/article/details/120560678
Classpath resource not found when running as jarhttps://stackoverflow.com/questions/25869428/classpath-resource-not-found-when-running-as-jar
ClassLoader defaultClassLoader = ClassUtils.getDefaultClassLoader();
try (InputStream inputStream = defaultClassLoader.getResourceAsStream("BOOT-INF/lib/asm-7.1.jar");) {
File somethingFile = new File("test.jar");
assert inputStream != null;
FileUtils.copyInputStreamToFile(inputStream, somethingFile);
} catch (IOException e) {
throw new RuntimeException(e);
}
接着还有另外一个需求,判断当前运行环境是不是 IDE,只需要在非 IDE 环境下读取 lib 下 jar 包。参考 这两篇文章。两个方法都能满足我的需求,我选择了第一种。代码如下:
如何判断当前Java代码是否运行在IDEA内https://blog.csdn.net/monarch91/article/details/124721203
方法一:
ClassLoader defaultClassLoader = ClassUtils.getDefaultClassLoader();
if (Objects.equals(defaultClassLoader.getResource("").getProtocol(), "jar")) {
System.out.println("jar 包运行");
} else {
System.out.println("非 jar 包运行");
}
方法二:
try {
Class.forName("com.intellij.rt.execution.application.AppMainV2");
System.out.println("in idea");
} catch (ClassNotFoundException ignored) {
System.out.println("not in idea");
}