首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用SpringBoot启动外部目录时,application.yml外部配置未被选中

使用SpringBoot启动外部目录时,application.yml外部配置未被选中
EN

Stack Overflow用户
提问于 2017-10-25 14:47:01
回答 2查看 665关注 0票数 2

我有一个服务需要在服务器上作为jar运行。因为jar的组件和依赖项使用spring & spring引导,所以这个jar包含spring,必须配置一个application.yml文件。我正在使用ansible来部署系统,但是我不能让ansible成功地启动服务,因为在启动时,服务不会获取application.yml文件。经过一些调试后,我发现如果我在与application.yml不同的目录中启动服务,那么它也会失败。

工作的设置:

  1. 使用springBoot任务构建带有gradle的tar。./gradlew build
  2. 将结果tar复制到远程服务器并解压缩。让我们调用解压缩目录deploy_dir
  3. 将生产application.yml复制到deploy_dir
  4. 将以下脚本(start.sh)复制到deploy_dir: #!/bin/bash nohup /home/ubuntu/deploy_dir/bin/project -Dspring.config.location=/home/ubuntu/deploy_dir/application.yml 1>/home/ubuntu/deploy_dir/out.log 2>&1 &
  5. ssh进入机器运行。/start.sh

这些步骤都能工作,但是如果我将start.sh复制到主目录,并从那里运行它,application.yml就不会被选中,我会得到以下错误。

2017-10-25 14:24:58.730 INFO 31582 --- [ main] o.s.b.f.s.DefaultListableBeanFactory : Overriding bean definition for bean 'dataSource' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari; factoryMethodName=dataSource; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Tomcat; factoryMethodName=dataSource; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Tomcat.class]] 2017-10-25 14:24:59.599 INFO 31582 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [class org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$c78541e8] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

让start.sh从主目录(或与application.yml所在的目录不同的目录)工作是很重要的,因为我坚信,让它在那里工作,将允许用正确的配置.启动jar。

分级文件:

代码语言:javascript
运行
复制
apply plugin: 'groovy'
apply plugin: 'application'
apply plugin: 'org.springframework.boot'
sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
compile('org.springframework.boot:spring-boot-starter-data-jpa')

compile 'org.codehaus.groovy:groovy-all:2.4.0'
compile group: 'log4j', name: 'log4j', version: '1.2.17'
compile('com.github.groovy-wslite:groovy-wslite:1.1.2')
compile group: 'org.quartz-scheduler', name: 'quartz', version: '2.3.0'
compile group: 'com.google.code.gson', name: 'gson', version:'2.8.0'

runtime('org.postgresql:postgresql')
runtime('com.h2database:h2')

}

jar {
baseName = 'project'
version =  '0.0.1'
manifest {
    attributes(
            'Class-Path': configurations.compile,
            'Main-Class': 'com.MainClass'
    )
}
}
EN

回答 2

Stack Overflow用户

发布于 2017-10-25 14:56:02

请尝试将您的配置位置设置为目录。还把"file:“前缀放在前面。

代码语言:javascript
运行
复制
-Dspring.config.location=file:/home/ubuntu/deploy_dir/
票数 0
EN

Stack Overflow用户

发布于 2017-10-25 19:29:30

我找到的解决方法是在start.sh中添加一行到cd到脚本工作的目录中。这适用于在服务器上手动运行start.sh脚本。我真的不知道为什么这会起作用,而且看上去很模糊,但这才是有效的。

start.sh

代码语言:javascript
运行
复制
#!/bin/bash
cd /home/ubuntu/deploy_dir
nohup /home/ubuntu/deploy_dir/bin/project -Dspring.config.location=/home/ubuntu/deploy_dir/application.yml 1>/home/ubuntu/deploy_dir/out.log 2>&1 &
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46935501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档