compile files('spring-core.jar', 'spring-aop.jar')
compile fileTree(dir: 'src/main/webapp/WEB-INF/lib', include: '*.jar')复制代码
dir 可以是绝对路径,也可以是相对于工程目录的项目路径
gradle assemble
gradle build 复制代码
打包时制定包名,例如默认打包出来是
Exam.war
,而我们需要的是
Exam.zip
war.archiveName 'Exam.zip'复制代码
gradle compileJava复制代码
def loadConfiguration() {
// 获取 gradle 参数中 -Penv 的值: gradle -Penv=development clean assemble
def environment = hasProperty('env') ? env : 'development'
def configFile = file('config.groovy') // 配置文件
return new ConfigSlurper(environment).parse(configFile.toURI().toURL()).toProperties()
processResources {
// src/main/resources 下的文件中 @key@ 的内容使用 config.groovy 里对应的进行替换
from(sourceSets.main.resources.srcDirs) {
filter(ReplaceTokens, tokens: loadConfiguration())
}复制代码
// config.groovy 的内容
environments {
development {
host = '127.0.0.1'
username = 'root'
password = 'root'
database = 'db_exam'
production {
host = '192.168.10.123'
username = 'root'
password = 'sluper'
database = 'db_exam'
}复制代码
apply plugin: 'org.akhikhl.gretty'
buildscript {
repositories {
jcenter()
dependencies {
classpath 'org.akhikhl.gretty:gretty:1.4.0'
gretty {
port = 8080
contextPath = ''
servletContainer = 'tomcat7'
}复制代码
// gretty 的更多配置
gretty {
httpPort = 8080
debugPort = httpPort + 1
servicePort = httpPort + 2
statusPort = httpPort + 3
httpsPort = httpPort + 4
httpsEnabled = true
contextPath = ''
jvmArgs = ['-Xmx1024M', '-XX:PermSize=128M', '-XX:MaxPermSize=256M']
servletContainer = 'jetty7'
scanInterval = 0
inplaceMode = 'hard'
debugSuspend = false
enableNaming = true // 启用 JNDI
managedClassReload = true
}复制代码
Tomcat 的 GET 请求的默认编码是 ISO8859-1,如果 GET 需要使用 UTF-8 的话,需要在
server.xml
中设置
URIEncoding
为 UTF-8:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"/>复制代码
在 Gretty 中没有提供设置
URIEncoding
的选项,但是可以设置
serverConfigFile
引用 Tomcat 的
server.xml
来达到目的,例如:
gretty {
httpPort = 8080
contextPath = ''
servletContainer = 'tomcat7'
serverConfigFile = "server.xml"
inplaceMode = 'hard'
debugSuspend = false
managedClassReload = true
recompileOnSourceChange = false
}复制代码
Gretty 热部署的相关配置,下面几项都默认设置为 true (reload 表示重新加载整个 web 应用):
recompileOnSourceChange
// Java 文件变化后自动编译
reloadOnClassChange
// Class 文件变化后 reload
reloadOnConfigChange
// 配置文件如 web.xml 变化后 reload
reloadOnLibChange
// lib 目录下的 jar 变化后 reload
例如 Java 文件修改保存后会自动编译,导致 Class 文件变化,然后 gretty 会重新加载整个 Web 应用,例如应用启动时要执行计划任务,检查数据库的结构等,这样的热部署效率太低。
如果 Class 文件变化后,能不能只加载 Class 文件,而不是重新加载整个 Web 应用呢?设置
managedClassReload=true
即可 (使用的是 SpringLoaded 来进行热加载,并自动设置 reloadOnClassChange=false):
gretty {
port = 80
contextPath = '/'
servletContainer = 'tomcat7'
managedClassReload = true
recompileOnSourceChange = false // 禁止自动编译过度频繁的进行热部署
}复制代码
parent
是父模块
mix1
和
mix2
是子模块
└── parent
├── mix1
│ ├── build.gradle
│ └── src
│ └── main
│ ├── java
│ └── resources
├── mix2
│ ├── build.gradle
│ └── src
│ └── main
│ ├── java
│ └── resources
├── build.gradle
└── settings.gradle复制代码
include 'mix1'
include 'mix2'复制代码
allprojects {
ext {
profile = System.getProperty("profile", "dev")
println '++ Building: ' + project.name
subprojects {
apply plugin: 'java'
tasks.withType(JavaCompile) {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
[compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8'
repositories {
mavenLocal()
mavenCentral()
project('mix1') {
println 'Building module mix1'
configure(subprojects.findAll {
it.name.equals('mix1') ||
it.name.equals('mix2')
}) {
apply plugin: 'java'
}复制代码
进入 parent 目录:
执行
gradle build
构建所有的模块
执行
gradle :mix1:build
构建子模块
mix1
println "${rootProject.projectDir}/config"
println ${rootProject.projectDir} + "/config"复制代码
Gradle 默认的打包任务
jar
不能带上依赖的类,在有依赖 Spring 的项目中,最好是使用
shadowJar
来打包,其会合并 spring 冲突的配置文件,例如 fatJar 则不会。
如果是可执行的 jar 包,配置 mainClassName 为 jar 包启动运行的类,否则可以忽略掉。
apply plugin: 'java'
apply plugin: 'application'
apply plugin: 'com.github.johnrengelman.shadow'
buildscript {
repositories { jcenter() }
dependencies { classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.3' }
mainClassName = 'Foo'
jar {
manifest { attributes 'Main-Class': mainClassName }
// 打包命令: gradle clean shadowJar
shadowJar {
mergeServiceFiles('META-INF/spring.*')
}复制代码