使用带有gradle插件的Spring Tool Suite 3.5,gradle 1.11
我想实现这一点:无论是在从命令行运行gradle build
时,还是在从Eclipse部署到Tomcat时,都将项目依赖库的内容提取到WAR文件中。
我的build.gradle项目是这样的:
apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'eclipse-wtp'
webAppDirName = 'WebContent'
configurations{
common
}
eclipse{
wtp {
facet{
facet name: 'jst.web', version: '3.0'
facet name: 'java', version: '1.7'
}
}
}
war{
from ({zipTree(configurations.common.singleFile)}){
into('common')
}
}
dependencies {
common "group:artifact:version:common@jar"
}
Eclipse没有按照war{}
部分中的规定提取configurations.common
,因此我不得不稍微修改一下脚本:
eclipse{
wtp{
facet{
...
}
component{
resource sourcePath: "build/common", deployPath: "/common"
}
}
}
task extractCommon(type:Copy){
from {
configurations.common.collect{ zipTree(it) }
}
exclude 'META-INF/**'
into "$buildDir/common"
}
eclipseClasspath.dependsOn(extractCommon)
通过这种方式,在重新创建eclipse项目文件和设置之前提取dependent JAR,但不幸的是,webAppDirName
从eclipse项目中的Deployment Assembly设置中消失。
因此,另一种解决方法:
eclipse{
wtp{
facet{
...
}
component{
resource sourcePath: "build/common", deployPath: "/common"
resource sourcePath: "$webAppDirName", deployPath: "/"
}
}
}
eclipse以这种方式运行,但它看起来很麻烦,我觉得我错过了一些东西,eclipse-wtp插件应该以某种方式自动完成这项工作。
有没有更简单的方法可以实现:
- Eclipse在从Eclipse部署时遵循
war{}
块中定义的规定行为(在创建web之前提取一些JAR应用程序) - 以增量方式定义
resources
,而不从部署中清除webAppDirName
文件夹
编辑:让我重新表述一下这个问题:
如果我有一个war项目,具有典型的目录结构
src
main
java
webapp
generated_source
build.gradle是这样的:
apply plugin:'java'
apply plugin:'war'
apply plugin:'eclipse-wtp'
eclipse.wtp.component.resource(sourcePath:'generated_source', deployPath:'/WEB-INF')
然后在运行gradle cleanEclipse eclipseWtpComponent
之后,生成的文件-.settings/org.eclipse.wst.common.component
应该是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<project-modules id="moduleCoreId" project-version="2.0">
<wb-module deploy-name="gradleissue">
<property name="context-root" value="gradleissue"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="src/main/java"/>
<wb-resource deploy-path="/" source-path="src/main/webapp"/>
<wb-resource deploy-path="/WEB-INF/" source-path="generated_source"/>
</wb-module>
</project-modules>
但看起来是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<project-modules id="moduleCoreId" project-version="2.0">
<wb-module deploy-name="gradleissue">
<property name="context-root" value="gradleissue"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="src/main/java"/>
<wb-resource deploy-path="/WEB-INF/" source-path="generated_source"/>
</wb-module>
</project-modules>
/src/main/webapp
文件夹已从部署程序集中消失。我有一种不好的感觉,这不是它应该做的。我还检查了测试https://github.com/gradle/gradle/blob/master/subprojects/ide/src/test/groovy/org/gradle/plugins/ide/eclipse/EclipseWtpPluginTest.groovy而且这个案子好像不见了(我不是一个时髦的家伙)。
您是否将"generated_source"目录添加到源代码集中?我有类似的项目设置,但我以不同的方式组织我生成的源目录:
src/main
java
generatedJava
webapp
然后您只需要将生成的Java目录添加到源集中:
sourceSets.main.java {
// added additional source folder for generated classes
srcDir "${rootDir}/src/main/generatedJava"
}
这导致了预期的eclipse wtp配置:
<?xml version="1.0" encoding="UTF-8"?>
<project-modules id="moduleCoreId" project-version="2.0">
<wb-module deploy-name="myproject">
<property name="context-root" value="myproject"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="src/main/resources"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="src/main/java"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="src/main/generatedJava"/>
<wb-resource deploy-path="/" source-path="src/main/webapp"/>
</wb-module>
</project-modules>
您可以在github上找到一个工作示例构建:https://github.com/jereh16/gradle-example-build