我正在为Spring服务器的JAR构建一个UI。我有一堆Angular JS页面。我想将命令行参数传递给我的jar,告诉它API服务器的位置如下:
java -jar application.jar --api=http://ip:9000
所以我的application.properties文件有:
url=${api:http://localhost:9000}
我目前正在做的方法是在我的每个.html页面上都有一个硬编码的js配置文件:
<script src="../js/appName/config.angular.js"></script>
其中包含:
var configData = {
url:"http://localhost:9000"
};
并在每个文件中调用:
$scope.apiUrl = configData.url;
如何在运行时使用我的JAR命令行参数覆盖application.properties文件,以及现在编码的方式。
答案 0 :(得分:1)
我是否正确:客户端部分由应用程序提供?因此,“运行时”中最后一句的部分更具有“bootstrap / initial loading”的含义,对吧?一种(旧学校)方法是通过应用程序(一个简单的模板引擎)提供入口html(例如index.html),并使用JS配置对象中的setter提供所需的信息:
// pseudo js code with thymeleaf
<script th:inline="javascript">
/*<![CDATA[*/
myConfig.url = [[${#httpServletRequest.remoteHost}]];
/*]]>*/
</script>
这只是一个只会设置远程主机名的示例,但我想你明白了。
旁注:我仍然不明白为什么你要设置它。如果应用程序包含客户端代码,为什么使用绝对URL进行远程调用? (免责声明:我只有Angular(2)和AngularJS的经验)
答案 1 :(得分:1)
从命令行传递值并且属性文件中存在相同的属性名称时,spring boot会覆盖命令行中的值。所以要实现你想做的事情
在application.properties
中#this is default value
app.url=localhost:8080
创建一个类来映射属性值,或者您可以根据项目结构使用现有的类或其他类。
@Component
public class Sample {
@Value("${app.url}")
private String url;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
现在当您执行带参数--app.url="someserver:9090"
的jar时,该值将被覆盖,您可以在任何地方使用此值。
注意,如果您尝试使用表达式直接在jsp中访问属性值,它也会起作用。
试试吧,它有效。我在我的最新项目中使用了相同的东西,这是一个复合微服务,每个组件都需要彼此的URL。
[编辑] 参考:http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html