使用命令行参数进行Spring + Angular + JAR构建

时间:2016-11-23 05:38:31

标签: angularjs spring

我正在为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文件,以及现在编码的方式。

2 个答案:

答案 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