您的位置:首页 > 编程语言 > Java开发

使用Gradle构建基于Groovy语言的经典Java EE应用

2014-12-29 17:29 489 查看

经典Java EE技术

经典Java EE技术是指Java EE原生支持的技术,包括EJB、JPA、JSF、CDI等。与经常使用的Spring+Struts2(或者Spring MVC)+Hibernate轻量级Java EE框架组合不同,经典Java EE由Java EE容器直接提供技术实现,所以在引入Groovy语言支持和项目打包都有所不同。

轻量级SSH框架应用只需要打一个war包即可放入EE容器或Web服务器发布。但是经典EE应用还是建议打一个ear包,其中内容至少由三部分组成:EJB和JPA部分、JSF部分和通用接口部分。

本文主要叙述在Wildfly 8系列EE容器上的Java EE 7应用的构建和部署,其他EE容器可能有部分位置需要修改,但按照Java EE标准,打包好的ear是可以通用部署的。

EAR打包要点

Java EE应用的部署有两种方法,不打ear包和打ear包。一般习惯上会将JSF部分打做一个war包,EJB和JPA部分打做一个jar包,并将war包和EJB的jar包部署在EE容器的部署目录下,通用接口部分打做一个jar包,作为library打进war和EJB的包里,并在其他需要远程访问EJB的位置,也需要引入通用接口jar。最新的EJB 3.1标准已经不需要再打独立的jar包了,可以把EJB打进war包里。

EJB和war分开部署可能会碰到的问题较多,虽然维护比较方便。打ear包可以使用application.xml对EE应用进行统一的配置和管理,这也是ear包的优势。

无论是分散打包还是集中打包,都需要注意,不能将项目开发时依赖的Java EE API的jar打进应用里,部署发生错误时,要优先查找应用内包含的依赖jar是否与EE容器提供的jar冲突。部署发生比较基础的错误时,比如实例化失败、初始化失败以及资源注入失败等,一般都与依赖包冲突有关,而与控制台错误提示关系不大。

JSF 2.2配置

JSF2主要需要的配置有web.xml、faces-config.xml,都在WEB-INF目录下。另外,在WEB-INF目录下,还应当放置一个空白的beans.xml,以防止Wildfly出现bug。其中faces-config.xml可以改名,但需要在web.xml中指出。

JSF2不像Struts和Spring MVC,需要模板文件目录,JSF2直接解析webapp目录下的内容,web.xml中的servlet-mapping一项中标示的是访问JSF2的链接后缀,此项不能与webapp目录下,需要经过JSF2解析的文件后缀重名,一般可选.jsf和.html。

javax.faces.DEFAULT_SUFFIX一项定义需要JSF2解析的文件的后缀,一般来说带有该后缀的文件可以认为是JSF2的模板文件,常用的文件后缀有.jsp和.xhtml,其中JSF2默认使用.xhtml。

javax.faces.STATE_SAVING_METHOD一项定义视图状态是保存于服务器Session还是保存于客户端,一般来说保存在客户端可以减轻服务负载,并在服务器重启之后,依旧能够保持视图状态。当该项定义为client时,需要注意同时应该定义jsf/ClientSideSecretKey一项,来指定在客户端保存视图状态的加密秘钥,否则部署时会报WELD-000340错误。加密秘钥的设定实际上是有要求的,需要选择8位、16位或32位长度的字符串,并进行Base64加密后,填写到web.xml中,不符合该要求的加密秘钥会被认为无效。

定义托管Bean时,尽量实现Serializable接口,防止容器报Managed Bean不能序列化的警告。

一般推荐JSF2使用Provided引入javax.faces-api 2.2的包,使用Compile引入primefaces包(也可以选择其他功能类似的包),使用Provided引入通用接口项目,必须使用Compile包含commons-fileupload包。

EJB 3.1配置

EJB的配置较为简单,位于Classpath的META-INF/beans.xml可有可无,对EJB的部署没有什么影响。

EJB编写时,建议尽可能使用CDI进行依赖注入,可以减小使用lookup查找的几率。

EJB只需要使用Provided引入通用接口项目即可。

JPA配置

(暂缺,待补)

加入Groovy语言支持

Groovy对Java进行了丰富的扩展,用来开发网页处理十分给力。在ear项目中引入Groovy支持不需要在每个模块中都引入Groovy包,只需要使用provided引用即可。

EJB的实现中,可以选择让Bean实现GroovyObject接口,便于Groovy进行EJB的注入。

Gradle示例配置文件

allprojects {
apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'idea'

sourceCompatibility = 1.7
targetCompatibility = 1.7
group = 'gradleee'

configurations {
provided
}

repositories {
maven { url "http://mirrors.ibiblio.org/maven2/" }
mavenCentral()
}

dependencies {
provided 'javax:javaee-api:7.0'
provided "org.codehaus.groovy:groovy-all:2.3.7"
provided 'javax.enterprise:cdi-api:1.2'
testCompile "junit:junit:4.11"
}

sourceSets {
main { compileClasspath += configurations.provided }
}

idea.module {
scopes.PROVIDED.plus += [configurations.provided]
}
}

project(':war') {
apply plugin: 'war'
dependencies {
provided project(':interface')
provided 'javax.faces:javax.faces-api:2.2'
compile 'org.primefaces:primefaces:5.1'
compile 'commons-fileupload:commons-fileupload:1.3.1'
}
}

project(':ejb') {
dependencies {
provided project(':interface')
}
}

project(':interface') {
}

apply plugin: 'ear'

dependencies {
deploy project(':ejb)
deploy project(path: ':war', configuration: 'archives')
earlib project(':interface')
earlib "org.codehaus.groovy:groovy-all:2.3.7"
}

ear {
appDirName 'src/main/META-INF'
libDirName 'libs'
deploymentDescriptor {
fileName = 'application.xml'
applicationName = 'GradleEE'
initializeInOrder = true
libraryDirectory = 'libs'
module("ejb.jar", "java")
webModule("war.war", "/")
}
}


Gradle配置技巧

Gradle没有定义Provided这个依赖选项,但是EE打包大部分时间都需要Provided选项,所以首先需要在根项目build.gradle中定义一个provided选项。

cofigurations中定义了provided选项,sourceSets中将provided选项内容加进了各项目的classpath,idea.module一项将provided标记的依赖同步进IDEA项目。

ear项目的依赖定义中,deploy标记的是需要部署到ear根目录下的内容,earlib标记的依赖是需要部署到ear下的library目录中的库内容。常规做法是将EJB和war都依赖的共享库内容都放置到ear下的library下,各自包中不放置共享库。

ear中的libDirName一项可以指定ear下的库目录位置。deploymentDescriptor一项即为application.xml的内容,如果在此定义application.xml内容,那么在项目中就可以不必再书写application.xml。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: