如何使用WebApplicationInitializer依赖项目?

时间:2017-01-30 07:26:18

标签: java spring gradle project-structure

我有一个项目结构,我有一些基本项目,其中实现了所有功能,并且在一些项目之上,用于不同类型的使用/部署,如下所示:

  • FOO核
  • foo-production,取决于foo-core(生成war文件,我交付给客户)
  • foo-standalone,取决于foo-core(产生用于内部测试的战争)
  • foo-ui-test,取决于foo-core(使用Arquillian + Selenium进行UI测试)

现在我有越来越多的类对foo-standalone和foo-ui-test很有用,但我不想将这些类部署到客户端。因此,foo-core可以作为存储这些类的可能项目。剩下的两个选项是:

  1. 依赖于foo-core并使foo-standalone和foo-ui-test依赖foo-helper而不是foo-core的新项目foo-helper。
  2. 让foo-ui-test取决于foo-standalone
  3. 我想选择2,因为我已经有很多项目。选项2的剩余问题是这两个项目(foo-standalone和foo-ui-test)都有一个Spring WebApplicationInitializer ...... 现在我摆弄了我的构建系统(我使用gradle)并且能够在foo-standalone项目中排除WebApplicationInitializer,并且在构建foo-standalone.war文件时只显式包含它。

    foo-standalone生成的build.gradle文件似乎“hackish”,如果我重命名或移动WebApplicationInitializer类,它将会中断。我想知道,如果还有另一种方法可以实现我正在寻找的东西,或者我是否需要制作一个新项目。

    更新 我将WebApplicationInitializer类从src / main / java移动到src / init / java并更改了foo-standalone的build.gradle,如下所示:

    sourceSets {
      init {
        java {
          compileClasspath += sourceSets.main.runtimeClasspath
        }
      }
    }
    
    war {
      classpath sourceSets.init.runtimeClasspath
    }
    

    我想这是最短的自定义方式,或者是否有内置的gradle功能可以做到这一点?

1 个答案:

答案 0 :(得分:0)

Maven只允许您对JAR项目具有依赖性。有一个功能,你可以有战争叠加,其中一个战争项目扩展一个孩子并覆盖某些位(见https://maven.apache.org/plugins/maven-war-plugin/overlays.html)这似乎是你的foo-standalone和foo-ui-test之间的关系。

所以让foo-helper成为一个战争项目并使foo-standalone,foo-ui-test和foo-production使用war叠加来扩展它。

foo-core可以保持为jar,如果有非生产位,则创建一个foo-core-internal来依赖foo-core和ring fences内部/测试位。