运行Jar包时如何为类中重写方法的静态常量传参?
问题描述
我在基于Maven的应用中有如下类:
public class VendorServiceWrapper implements Wrapper{ @Override public String getVendorDetails(String vendorNumber, String vendorType){ StringBuilder url = new StringBuilder(); url.append(baseUrl).append(VENDOR_SERVICE_API); -- } }
希望在运行Jar包时传入baseUrl和VENDOR_SERVICE_API这两个参数的值,这些变量类似静态常量,一旦传入值就不再修改,请问该如何设置?
解决方案
1. 定义静态不可变变量
在类中将baseUrl和VENDOR_SERVICE_API声明为static final(静态不可变)变量,通过静态代码块读取启动时传入的参数:
public class VendorServiceWrapper implements Wrapper{ // 静态不可变变量,初始化后无法修改 private static final String baseUrl; private static final String VENDOR_SERVICE_API; // 静态代码块读取系统属性,支持设置默认值 static { baseUrl = System.getProperty("app.baseUrl", "http://default-base-url.com"); VENDOR_SERVICE_API = System.getProperty("app.vendorApi", "/default-vendor-path"); } @Override public String getVendorDetails(String vendorNumber, String vendorType){ StringBuilder url = new StringBuilder(); url.append(baseUrl).append(VENDOR_SERVICE_API); // 补充后续业务逻辑 return url.toString(); } }
2. 运行Jar时传入参数
启动Jar包时,通过-D参数传递系统属性,命令示例:
java -jar your-app.jar -Dapp.baseUrl=http://your-real-domain.com -Dapp.vendorApi=/api/vendors
3. 可选:Maven打包配置默认参数
如果需要在打包阶段设置默认启动参数,可以修改pom.xml中的maven-jar-plugin配置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <mainClass>your.package.MainClass</mainClass> </manifest> <manifestEntries> <Arguments>-Dapp.baseUrl=http://default-base-url.com -Dapp.vendorApi=/default-vendor-path</Arguments> </manifestEntries> </archive> </configuration> </plugin> </plugins> </build>
注:打包时配置的默认参数会被启动命令中传入的-D参数覆盖,命令行参数优先级更高。
关键说明
static final变量一旦初始化完成就无法修改,完全符合“静态常量”的需求- 参数命名建议添加自定义前缀(如
app.),避免与系统原生属性冲突 - 为参数设置默认值可以避免因启动时未传参导致的初始化失败
内容的提问来源于stack exchange,提问作者Ayush Goyal
相关产品推荐
相关产品推荐

