SpringBoot 读取 jar 包中 BOOT-INF/lib 下的 jar包

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 程序的运行方式, file(在IDE中运行) 或 jar(以jar包方式运行)https://blog.csdn.net/mrathena/article/details/124413570

 如何判断当前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");
}

你可能感兴趣的:(Web,jar,spring,boot,java)