【问题标题】:Shared gradle project in spring boot does not contain yml filesSpring Boot 中的共享 gradle 项目不包含 yml 文件
【发布时间】:2016-06-05 17:03:50
【问题描述】:

我有项目 AB,它们都将 common 项目作为编译依赖项定义在它们的 build.gradle 文件中,如下所示:

dependencies {
    compile project(":common")


    compile('org.springframework.boot:spring-boot-starter-actuator')
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.springframework.boot:spring-boot-starter-security')
    compile('org.springframework.boot:spring-boot-starter-cache')
    compile("net.oauth.core:oauth:20090617")
    compile("net.oauth.core:oauth-httpclient4:20090617")
    compile('org.apache.httpcomponents:httpclient')
    compile("com.atlassian.jira:jira-rest-java-client:2.0.0-m2")
    compile("com.google.guava:guava:18.0")
    compile('org.flywaydb:flyway-core')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

这个通用项目有 application.yml 文件,其中包含各种通用信息,例如数据库连接属性、休眠设置等。所以我不想将这些文件复制到其他项目中,例如 A 和 @987654326 @。

A 项目中,主 Spring Boot 文件如下所示:

@SpringBootApplication(scanBasePackageClasses = {CommonApp.class,
        A.class})
public class A {

    public static void main(String[] args) {
        SpringApplication.run(A.class, args);
    }
}

其中CommonAppcommmon 项目中的主类。这个common 主文件如下:

    @SpringBootApplication
public class CommonApp {

    public static void main(String[] args) {
        SpringApplication.run(CommonApp.class, args);
    }
}

项目AB 编译得很好,但是common 项目的类路径中的所有yml 文件在AAB 中不可见,所以我别无选择在AB 中手动复制它们

什么是更好的方法? spring boot 常用项目可以和其他项目共享资源吗?

请注意,理想的解决方案不应该依赖于 gradle,因为我想从 Intellij IDEA 运行单元和集成测试,它不使用 gradle 来运行测试。

我的应用结构是

app
 |-A
   |-build.gradle
 |-web
    |-B
      |-build.gradle
 |-common
    |-src/main/resources
                |-application.yml
                |-database.yml
                |-web.yml
 |-settings.gradle
 |-build.gradle

A、B、common都是spring boot的app(common也是boot app,但是只作为A、B的依赖)。

【问题讨论】:

  • 能展示一下常用项目的文件夹结构吗?您是否将 yaml 文件打包到您发布的 jar 中?
  • 不,我没有将 yaml 打包到罐子里,我该怎么做? gradle 脚本不是开箱即用的吗?
  • 非代码文件在标准资源文件夹 (src/main/resources) 中自动包含在 jar 中,或者它们的位置作为资源位置。在您上面列出的结构中,yaml 文件位于何处?
  • 是的,对不起。我也将 yml 文件添加到列表中。我在 gradle 的项目中没有添加自定义资源源集文件夹。

标签: java spring gradle spring-boot


【解决方案1】:

如果你想要一个非 gradle 解决方案,你总是可以添加一个 DAO 式文件来访问公共项目中所需的值,然后 jar 你的公共项目并将其作为依赖项添加到项目 A 和 B。

编辑:对不起,我没有很好地解释。当我说“DAO-esque 文件”时,我的意思是访问属性文件的 getter 文件(如果需要,还有 setter 文件)。例如,有一个单例的 getter 文件。创建时,创建对属性文件的静态引用。当项目 A(或 B)需要一个属性时,它可以调用这个文件来获取该属性。

至于 gradle 解决方案,看起来你的上面与你的相当接近

compile project(":common")

代码。您是否有包含该行的 settings.gradle 文件

includeFlat "common"

以及对与项目 A 和 B 位于同一目录中的公共项目的引用?例如

项目A

(...项目 A 的文件...)

项目 B

(...项目 B 的文件...)

常见的 (...普通文件...)

【讨论】:

  • 您能否详细说明一下这个 DAO 式文件是什么?另外,对此有什么好的解决方案?
  • 问题是我在标有@ConfigurationProperties 注释的bean 中定义了我的属性,但问题是这个bean 的getter 返回null,因为没有这个bean 引用的基础属性文件。如果您可以提供一些代码 sn-p 来说明您的想法,那么我可能会让事情变得更清楚。
  • 至于 gradle 方法,我在设置文件中有一个include "common",而不是includeFlat 的想法。另外我不太明白“引用与项目A和B在同一目录中的公共项目”句子中的引用是什么意思?
猜你喜欢
  • 2017-12-15
  • 1970-01-01
  • 2017-09-25
  • 2013-08-05
  • 2022-11-17
  • 2018-09-29
  • 2012-03-01
  • 2018-08-28
  • 1970-01-01
相关资源
最近更新 更多