SpringBoot获取jar文件所在目录

一开始是想通过以下方法获取:
java.lang.System.out.println(java.lang.System.getProperty("user.dir"));

例如我把jar文件放在/opt/test/目录下,并且把当前工作目录定位在/opt/test/目录下,获取到的结果确实是:/opt/test/

但是!

但是!

但是!当我把工作目录切换(cd /home/)到其它地方:例如:/home/

这时候再次通过上面的方式获取到的结果就不是理想的结果了,而是:/home/

之后我再继续研究可以通过第二个方法获取到理想的结果:

private static final String APPLICATION = "/application.yml";
private static final String JAR = "jar";
private static final String FILE = "file:";
java.lang.Class<?> clazz = SpringApplication.class;
java.lang.ClassLoader classLoader = clazz.getClassLoader();
java.net.URL url = classLoader.getResource(APPLICATION);
if (url != null) {
    java.lang.String path = url.getPath();
    java.lang.String[] nameArray = path.split(java.io.File.separator);
    int i = 0;
    java.lang.StringBuilder stringBuilder = new java.lang.StringBuilder();
    for (; i < nameArray.length; i ++) {
        java.lang.String name = nameArray[i];
        if (name.contains(JAR)) {
            break;
        } else {
            stringBuilder.append(name).append(java.io.File.separator);
        }
    }
    java.lang.String target = stringBuilder.toString();
    if (target.startsWith(FILE)) {
        target = target.substring(FILE.length());
    }
    java.lang.System.out.println("target->" + target);//这里打印输出:/opt/test/
} else {
    java.lang.System.out.println("url is null");
}
### 使用 Gradle 将 Spring Boot 项目打JAR 文件 为了实现将 Spring Boot 项目通过 Gradle 打JAR 文件,可以按照以下方式操作: #### 配置 `build.gradle` 文件 在项目的根目录下找到或创建 `build.gradle` 文件,并添加必要的插件和配置。 ```groovy plugins { id 'org.springframework.boot' version '2.7.0' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' repositories { mavenCentral() } dependencies { implementation('org.springframework.boot:spring-boot-starter-web') // 只编译阶段使用的依赖项,不被打到最终的 JAR 中 compileClasspath('org.springframework.boot:spring-boot-starter-freemarker') } ``` 上述代码中,`implementation` 是用于正常打的依赖项,而 `compileClasspath` 则表示该依赖仅会在编译时加载,不会被含在最终生成的 JAR 文件中[^1]。 #### 设置主类路径 为了让生成的 JAR 文件能够正确运行,需要指定应用程序的入口点(即主类)。可以在 `build.gradle` 文件中加入如下配置来定义主类: ```groovy jar { manifest { attributes( 'Main-Class': 'com.wafa.mallServer.LanyiMallServerApplication', ) } } ``` 此部分确保了当用户尝试执行生成的 JAR 文件时,Java 能够识别并调用正确的启动类[^2]。 #### 构建命令 构建过程可以通过控制台完成。进入项目所在的文件夹,在终端输入以下指令即可开始构建流程而不执行任何单元测试: ```bash gradle build -x test ``` 完成后,生成的目标 JAR 文件会位于 `build/libs/` 下面。 如果希望进一步优化 JAR 文件大小,则考虑采用 **thinJar** 方法。这涉及调整哪些库应该嵌入以及哪些应保持外部链接状态。具体做法已在前面提到过——利用 `compileClasspath` 来排除不必要的内部化依赖关系[^3]。 另外需要注意的是,尽管 thinJar 技术有助于减小部署单位尺寸,但在某些情况下可能会引发诸如 `ClassNotFoundException` 这样的错误。这是因为一些反射机制可能无法正确定位由上下文类加载器管理之外引入的类别资源。解决办法之一便是修改相关代码逻辑以便适配新的环境设定;例如更改获取类实例的方式从静态绑定转向动态装载[^4]。 ```java // 修改前可能导致异常的情况 Class<?> clazz = Class.forName(className); // 推荐替代方案以规避潜在问题 Class<?> clazz = Thread.currentThread().getContextClassLoader().loadClass(className); ``` 以上就是关于如何运用 Gradle 对于 Spring Boot 应用程序实施有效的 JAR 归档处理策略的整体介绍。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值