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

##经典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。

转载于:https://my.oschina.net/midnite/blog/362017

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值