标准的EclipseWTP项目的目录结构是:
src:存放源代码文件,包括Java和资源(非Java文件,例如:xml、properties等)文件
WebContent:存放web文件
Gradle的Web项目的目录结构是:
src/main/java:存放源代码的Java文件
src/main/resources:存放源代码的资源文件
src/main/webapp:存放web文件
因为这两种项目结构存在差异,所以如果想为标准EclipseWTP项目添加Gradle功能必须修改目录结构。如果勤快一点可以通过操作Eclipse拖拖拽拽完成,或者通过Gradle的自定义task来完成,当然本文说的是第二种方式。
Gradle的一个非常灵活的功能是,运行在脚本中使用Groovy代码,甚至定义class也可以,所以我们定义两个class,分别代表上面的两种项目结构:
标准的EclipseWTP项目(EclipseWtpProject.groovy)
package com.bstek.gradle;
class EclipseWtpProject {
def rootDirName;
def rootDir;
def srcDirName;
def srcDir;
def webDirName;
def webDir;
def project;
EclipseWtpProject(def project, rootDirName = 'oldSrc', srcDirName = 'src', webDirName = 'WebContent') {
this.project = project;
this.rootDirName = rootDirName
rootDir = project.file(rootDirName);
this.srcDirName = srcDirName
srcDir = project.file(rootDirName + '/' + srcDirName)
this.webDirName = webDirName
webDir = project.file(rootDirName + '/' + webDirName)
}
def check() {
def dirs = [srcDir, webDir];
dirs.each { dir ->
if (!dir.exists()) {
throw new FileNotFoundException(dir.toString());
}
}
}
}
Gradle的Web项目(GradleWtpProject.groovy)
package com.bstek.gradle;
class GradleWtpProject {
def javaDir
def resourceDir
def webappDir
def project
def GradleWtpProject(def project) {
this.project = project;
javaDir = project.file('src/main/java')
resourceDir = project.file('src/main/resources')
webappDir = project.file('src/main/webapp')
}
def create() {
def fs = [javaDir, resourceDir, webappDir]
fs.each { f ->
if (!f.exists()) {
f.mkdirs();
}
}
}
def delete() {
def fs = [javaDir, resourceDir, webappDir]
fs.each { f ->
if (f.exists()) {
f.delete();
}
}
}
def recreate() {
delete();
create();
}
}
将上面的两个文件存放在buildSrc/src/main/groovy目录下,当然必须遵守package的目录结构。
接下来build.gradle的代码就很简单了,
build.gradle
import com.bstek.gradle.*;
apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'eclipse-wtp'
buildDir = file('gradle-build')
now = new Date()
version = now.format('yyMMddHHmm')
task createGradleWebProject(dependsOn: 'eclipse') {
description = 'Convert a eclipse-wtp projeto to a eclipse-wtp with gradle support.'
wtpProject = new GradleWtpProject(project);
wtpProject.recreate();
def oldProject = new EclipseWtpProject(project)
oldProject.check();
//Copy Java
project.copy {
into(wtpProject.javaDir)
from oldProject.srcDir
include '**/*.java'
}
//Copy Resources
project.copy {
into wtpProject.resourceDir
from oldProject.srcDir
exclude '**/*.java'
exclude '**/.svn/**'
}
//Copy Webapp
project.copy {
into wtpProject.webappDir
from oldProject.webDir
exclude ('**/.svn/**', 'WEB-INF/classes/**', 'WEB-INF/lib/**')
}
}
使用方法:
在gradle项目下创建oldSrc目录
将EclipseWTP项目文件复制到oldSrc中
在控制台中执行:gradle createGradleWebProject
oldSrc目录已经完成了使命,可以删除了(当然谨慎的你可能不会立即这么做)
使用效果:
生成src/main/java目录,并且已经包含所有的java代码
生成src/main/resources目录,并且已经包含所有的资源文件
生成src/main/webapp目录,并且已经包含全部的web文件
生成.project文件
生成.classpath文件
生成.setting文件夹,包含org.eclipse.jdt.core.prefs、org.eclipse.wst.common.component、org.eclipse.wst.common.project.facet.core.xml文件
通过Eclipse的Import Existing Projects into Workspace功能将新的项目添加到Eclipse中进行开发