1:安装jdk和maven
1)JAVA_HOME 设置为刚才安装的JDK的安装路径
2)M2_HOME设置为Maven的安装路径
3)path 部分 添加:%M2_HOME%\bin;%JAVA_HOME%\bin
关于maven的本地仓库和maven proxy设置详见【Maven安装和使用】
2:构建项目
mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-struts - DremoteRepositories=http://static.appfuse.org/releases -DarchetypeVersion=2.0.2 -DgroupId=com.onet.bd - DartifactId=BDSystem
可以参考appfuse官方网站上的构建命令,其中DgroupId:所构建项目的包名称,DartifactId:项目名称。
3:运行工程
mvn jetty:run-war
打开浏览器http:localhost:8080/即可以看到生成的web项目
4:获得源文件
mvn appfuse:full-source
6:生成eclipse项目文件
mvn install eclipse:eclipse
1. 由表生成model 运行mvn appfuse:gen-model
会在model包中生成Person.java查看原代码,原来model中有两个ID的生成策略,如下:
@Id @GeneratedValue(strategy=IDENTITY) @GeneratedValue(strategy = GenerationType.AUTO)
删除@GeneratedValue(strategy=IDENTITY),只剩下一个。
2.由model 生成CRUD 运行mvn appfuse:gen -Dentity=Person会生成personList.jsp、
personForm.jsp、PersonAction.java 但是没有自动生成dao与service 而是采用的
GenericManager<Person, Long>中的方法。如果想生成相应的service和dao需要修改pom.xml
配置文件。在项目下的pom.xml中查找genericCore,大概在940行 找到 将属性true 改为false
像这样<amp.genericCore>false</amp.genericCore>,重新运行 mvn appfuse:gen -Dentity=Person
在eclipse中查看代码 dao 与 service也都生成了。
3.乱码问题
对于APPFUSE生成的工程运行时乱码是很常见的现象,造成该现象的原因也有几种:
为了偷懒,这里引用一篇网上的文章:http://www.blogjava.net/43880800/archive/2006/11/18/81892.html
对于国际化文件*.properties文件的编辑,有两个ECLIPSE插件可以推荐使用PropertiesEditor 和
ResourceBundleEditor 再次偷懒引用一篇网文:http://blog.csdn.net/lmjq/archive/2007/06/21/1660137.aspx
mvn appfuse:gen-model | 根据数据库的表生成java类 |
mvn appfuse:gen | 根据 POJOs.生成并安装Tests, DAO, Managers, Controllers and Views |
mvn appfuse:full-source | 把运行所需要的org.appfuse中的依赖类转换成你的包名称 |
mvn eclipse:eclipse | 生成eclipse的项目的配置文件,用户可以直接把项目导入到eclipse中 |
mvn jetty:run-war | 打包并且发布你的应用程序到Jetty, 查看在 http://localhost:8080 |
mvn appfuse:install | 把生成的源代码及配置文件写入到src中 |
mvn integration-test | 启动TOMCAT(或别的服务器)进行测试 |
mvn appfuse:remove | 删除appfuse:gen.生成的代码 |
mvn appfuse:clean | 清除target下的所有内容 |
出处:http://www.blogjava.net/shiwenfeng/default.html?page=4
注:如果要使用Ibatis ,参考官网设置:
http://appfuse.org/display/APF/Using+iBATIS
AppFuse是Matt Raible开发的一个指导性的入门级J2EE框架,它集成了众多当前最流行开源框架与工具(包括Hibernate、ibatis、Struts、Spring、DBUnit、Ant、Maven、Log4J、Struts Menu、Xdoclet、SiteMesh、OSCache、EHCache、JUnit、JSTL等)于一身的WEB开发框架。后期的版本更是提供了对Taperstry和JSF的支持。
AppFuse提供了WEB系统开发过程中都需要开发的一些功能,比如登陆、用户密码加密、用户管理、角色和权限管理、根据不同的用户可以展现不同的菜单等,J2EE开发者也可以在此基础上开发加入自己的功能模块。
为了简化开发,AppFuse预定义好了一套目录结构、基类、用来创建数据库、配置Tomcat、测试部署应用的任务,帮助快速自动生成源程序和自动维护部分配置文件。
本文讲解下如何利用AppFuse在较短的时间内生成配置好WEB开发框架,并生成每个系统都会使用的权限管理,提高效率,敏捷开发,从而作为大家开发Java企业应用的方便起点。
MyEclipse6.6工具进行Web开发,敏捷开发,项目原型验证开发
开发环境:MyEclipse6.6,JDK 1.6,Java EE 5.0,Tomcat6.0,Struts2以上,Spring2.0,Hibernate3.0,MySQL5.5,MySQL Workbench 5.2.25 CE;
设置环境变量:
配置 JAVA_HOME ,MAVEN _HOME
JAVA_HOME D:\Java Tools\Java\jdk1.6.0_14
MAVEN_HOME D:\apache-maven-2.2.1
在PATH中添加%JAVA_HOME%\bin;% MAVEN _HOME%\bin;
Archetypes 现在包括web模块的所有源码,可以更加顺利地使用jetty:run 和在 IDE 中运行。The backend is still embedded in JARs,可以选择您爱用的持久层框架(Hibernate, iBATIS or JPA)。
此外,AppFuse轻量级版本也转移到Maven。AppFuse提供了用于JSF, Spring MVC, Struts2和Tapestry5的archetype。
其他重要的改进:
基础的升级,包括 JIRA 4, Confluence 3, FishEye 2, Bamboo 2 和 Crowd 1.6.
Appfuse的官方网站是http://appfuse.org/display/APF/Home,解压后目录结构如下图:
2.1 Maven2.2.1的官方网站是http://maven.apache.org/download.html,解压后目录结构如下图:
2.2 打开D:\apache-maven-2.2.1\conf\settings.xml文件,修改localRepository值内容为:
<localRepository>D:/apache-maven-2.2.1/m2/repository</localRepository>
注意:localRepository值默认指向C:\Documents and Settings\chenming\.m2\repository的,感觉有问题,建议自行改变repository的位置。
2.3 然后将appfuse-dependencies-2.1.0.tar.gz解压到D:/apache-maven-2.2.1/m2/repository下面,如下图所示:
3.1创建自己存放项目的目录
比如在D盘根目录下建立一个文件夹appfuse_project,用来保存Appfuse生成的Web项目。
3.2 执行mvn archetype:generate命令,生成项目
运行cmd命令,进入D:\appfuse-tms目录,然后运行以下命令
mvn archetype:generate -B -DarchetypeGroupId=org.appfuse.archetypes
-DarchetypeArtifactId=appfuse-basic-struts-archetype -DarchetypeVersion=2.1.0
-DgroupId=com.launch.tms -DartifactId=tms
-DarchetypeRepository=http://oss.sonatype.org/content/repositories/appfuse
其中DgroupId= com.launch.tms 主包名
DartifactId=tms 项目名
AppFuse针对不同框架,提供了light版和basic版的项目模板,light版是简单版本,只有基本功能,basic版是扩展版本,提供了安全性支持,密码找回等常用功能。
如果不知道上述参数如何使用,参照 http://appfuse.org/display/APF/AppFuse+QuickStart
具体执行效果见下图所示:
看到上面的BUILD SUCCESSFUL证明TMS项目创建成功了。
在D:\appfuse-tms\tms目录下,可以看到AppFuse生成的项目文件。
4.1添加maven-eclipse插件
在pom.xml文件plugin为maven-compiler-plugin的上面,添加maven-eclipse插件,不添加这段会提示svn的一个错误。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.6</version>
</plugin>
4.2配置数据库
在pom.xml文件最下面的Database settings,修改数据库连接密码,文档最后面(jdbc.password)。
如果数据库名不是默认的tms,可以在pom.xml文件中查找db.name,然后修改为自己的数据库名,例如appfuse。
本文以MySQL为例来说明,具体配置内容如下所示:
<!-- Database settings -->
<dbunit.dataTypeFactoryName>org.dbunit.ext.mysql.MySqlDataTypeFactory</dbunit.dataTypeFactoryName>
<dbunit.operation.type>CLEAN_INSERT</dbunit.operation.type>
<hibernate.dialect>org.hibernate.dialect.MySQL5InnoDBDialect</hibernate.dialect>
<jdbc.groupId>mysql</jdbc.groupId>
<jdbc.artifactId>mysql-connector-java</jdbc.artifactId>
<jdbc.version>5.1.14</jdbc.version>
<jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName>
<jdbc.url>jdbc:mysql://localhost/${db.name}?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;autoReconnect=true</jdbc.url>
<jdbc.username>root</jdbc.username>
<jdbc.password>000000</jdbc.password>
进入项目根目录,运行命令:mvn appfuse:full-source,命令执行完成之后,将生成appfuse的源代码,包括User与Role等实体模型与操作。结果如下图所示:
由此生成的AppFuse源代码如下图:
同时,在D:\appfuse-tms\tms\src\main\java\com\cnlaunch\tms目录下面,你会看到自动生成的model和dao源代码。
修改src\main\resources\hibernate.cfg.xml文件的头部内容
修改前:
http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd
修改后:
http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd
如果src\test\resources\appfuse\model目录不存在,则须执行上述命令生成,执行后如图所示:
如果数据库中存在外键时,只须将src\test\resources\appfuse\model下面的Ejb3PropertyGetAnnotation.ftl文件中的${pojo.generateJoinColumnsAnnotation(property)}修改为${pojo.generateJoinColumnsAnnotation(property, cfg)}即可。
如果src\test\resources\目录中hibernate.reveng.xml文件不存在,则可以去D:\appfuse-tms\tms\target\test-classes目录下COPY这个文件到src\test\resources\下面。如果没有,则自己新建一个这样的文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-reverse-engineering
SYSTEM "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd" >
<hibernate-reverse-engineering>
<schema-selection match-schema="PASSPORT"/>
<type-mapping>
<!-- jdbc-type is name fom java.sql.Types -->
<sql-type jdbc-type="VARCHAR" length='1' hibernate-type="java.lang.String"/>
<!-- length, scale and precision can be used to specify the mapping precisly -->
<sql-type jdbc-type="NUMERIC" precision='1' hibernate-type="java.lang.Integer"/>
<!-- the type-mappings are ordered. This mapping will be consulted last,
thus overriden by the previous one if precision=1 for the column -->
<sql-type jdbc-type="BIGINT" hibernate-type="java.lang.Integer"/>
<sql-type jdbc-type="INTEGER" hibernate-type="java.lang.Integer"/>
<sql-type jdbc-type="NUMERIC" hibernate-type="java.lang.Integer"/>
</type-mapping>
<!-- BIN$ is recycle bin tables in Oracle -->
<table-filter match-name="BIN$.*" exclude="true"/>
<!-- Exclude AppFuse tables from all catalogs/schemas -->
<!--排除数据库不必生成的Model文件,比如一些关系表或已存在的实体Bean -->
<table-filter match-name="app_user" exclude="true"/>
<table-filter match-name="user " exclude="true"/>
<table-filter match-name="role" exclude="true"/>
<table-filter match-name="user_role" exclude="true"/>
</hibernate-reverse-engineering>
注意:通过mvn appfuse:full-source命令生成的User和Role,最好先不要改动它,因为涉及到DAO,Service,SignupAciton等地方,建议最好先象上面一样,过滤掉User和Role这两张表,不要产生相应的Model。因为如果你的User和Role数据表与AppFuse生成的User和Role字段不一致,会无法执行mvn appfuse:gen -Dentity=Employee命令,报一大堆BUG。
执行该命令前,要确认已在MYSQL中建立了相应的数据库,并建立相应的数据表。MYSQL默认采用utf8编码,而且数据库和数据表都采用utf8编码方式。
例如建立一张职员表Employee
CREATE TABLE `Employee` (
`id` bigint(20) NOT NULL auto_increment,
`code` varchar(10) NOT NULL,
`dept` varchar(50) NOT NULL,
`name` varchar(20) NOT NULL,
`status` varchar(10) NOT NULL,
`telephone` varchar(20) default NULL,
`title` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
初次执行mvn appfuse:gen-model命令时,会报错,提示有一些依赖库的版本不存在。例如${slf4j.version}不存在的情况,如下所示:
16) org.slf4j:jcl-over-slf4j:jar:${slf4j.version}
Try downloading the file manually from the project website.
Then, install it using the command:
mvn install:install-file -DgroupId=org.slf4j -DartifactId=jcl-over-slf4j -
Dversion=${slf4j.version} -Dpackaging=jar -Dfile=/path/to/file
Alternatively, if you host your own repository you can deploy the file there:
mvn deploy:deploy-file -DgroupId=org.slf4j -DartifactId=jcl-over-slf4j -Dversion=${slf4j.version} -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]
Path to dependency:
1) com.cnlaunch.tms:tms:war:1.0-SNAPSHOT
2) org.slf4j:jcl-over-slf4j:jar:${slf4j.version}
----------
31 required artifacts are missing.
总共缺少31个必要的依赖库,如下所示:
<aspectj.version>1.6.10</aspectj.version>
<commons.beanutils.version>1.8.3</commons.beanutils.version>
<commons.collections.version>3.2.1</commons.collections.version>
<commons.dbcp.version>1.3</commons.dbcp.version>
<commons.lang.version>2.6</commons.lang.version>
<compass.version>2.2.0</compass.version>
<cxf.version>2.3.3</cxf.version>
<dwr.version>2.0.3</dwr.version>
<ehcache.version>2.3.1</ehcache.version>
<ehcache.web.version>2.0.3</ehcache.web.version>
<hibernate.version>3.6.1.Final</hibernate.version>
<javamail.version>1.4.1</javamail.version>
<jpa.version>2.0-cr-1</jpa.version>
<jstl.version>1.1.2</jstl.version>
<log4j.version>1.2.16</log4j.version>
<sitemesh.version>2.4.2</sitemesh.version>
<slf4j.version>1.6.1</slf4j.version>
<spring.security.version>3.0.5.RELEASE</spring.security.version>
<struts.menu.version>2.4.3</struts.menu.version>
<urlrewrite.version>3.1.0</urlrewrite.version>
<velocity.version>1.4</velocity.version>
将上述内容添加到pom.xml的<properties>标签内,再次执行mvn appfuse:gen-model命令则会显示如下结果:
此时,会在src\main\java\com\cnlaunch\tms\model目录下产生一个Employee.java文件。
执行mvn appfuse:gen -Dentity=Employee命令后,会在target\appfuse\generated-sources\src\main\webapp\WEB-INF\pages产生employeeList.jsp、employeeForm.jsp页面;target\appfuse\generated-sources\src\main\java\com\cnlaunch\tms\webapp\action产生EmployeeAction.java,但是没有自动生成dao与service 而是采用的GenericManager<Employee, Long>中的方法。
解决办法如下:
在pom.xml文件中查找genericCore,将属性true 改为false
再次执行mvn appfuse:gen -Dentity=Employee命令,结果如下:
在src\main\java\com\cnlaunch\tms目录中查看dao,service,webapp\action目录,发现EmployeeDao、EmployeeManager、EmployeeAction都生成了。
在target\appfuse\generated-sources目录中也有相同的这些文件。
执行mvn eclipse:eclipse命令,结果如下:
执行mvn war:inplace命令,拷贝一些jar包到项目的lib下面;
打开eclipse或myeclipse工具,导入你的项目,添加一些缺少的依赖库即可。
解决 eclipse 里部署 test包报错的问题:从依赖包里查找以下jar包并导入junit-4.4.jar,spring-test-2.5.4.jar,jmock-1.1.0.jar,jmock-junit4-2.4.0.jar,subethasmtp-wiser-1.2.jar,这些jar的版本要弄清楚,在依赖包里搜索即可。
1>
AppFuse has a Maven Plugin that allows you to generate all the code in these tutorials. However, we recommend you complete these tutorials before using it so you're familiar with all the code that's being generated.
One of the nice features of AppFuse 2.x is you no longer need to create a DAO or Manager for type-safe CRUD functionality. You merely need to create Spring bean definitions. This means you should be able to easily develop a front-end without worrying about writing code for the backend (until you need customized functionality of course).
<2>
What the full-source plugin does:
Exports all sources from Subversion into your project. It reads the dao.framework and web.framework properties to determine what you need.
Removes warpath plugin from pom.xml.
Calculates dependencies by reading pom.xml files form the various AppFuse modules. It replaces your dependencies with these new ones. The order of the dependencies added is alphabetical based on groupId.
Reads properties from the root AppFuse pom.xml and adds the ones that don't exist to your project.
Renames packages to match your project's groupId.
If you want to customize the code generation templates (written in FreeMarker), you can copy them
into your project using the following command:
appfuse:copy-templates
<3>
改成:
<sql-type jdbc-type="NUMERIC" hibernate-type="java.lang.Integer"/>
//那么生成的javabean 字段也是Integer
Generates Java classes from existing database tables. If you want to customize the reverse engineering strategy,
you can modify the default hibernate.reveng.xml and put it in src/test/resources.
You can also override the location by specifying the "revengfile" property in the <configuration>. For example:
<configuration>
<componentProperties>
<revengfile>path/to/hibernate.reveng.xml</revengfile>
</componentProperties>
<genericCore>${amp.genericCore}</genericCore>
<fullSource>${amp.fullSource}</fullSource>
</configuration>
Oracle Users: If you create a custom hibernate.reveng.xml, make sure to capitalize the table names
in
<schema-selection match-schema="MY_SCHEMA_NAME"/>.
You'll also need to add the following line to
your jdbc.properties file:
hibernatetool.metadatadialect=org.hibernate.cfg.reveng.dialect.OracleMetaDataDialect
<4>
appfuse:copy-templates: Copies FreeMarker templates for CRUD generation into src/test/resources/appfuse.
These templates can be customized to fit your needs. You can delete the templates you don't customize and
the default templates will be used instead.
<5>在DAO用ibatis时,我遇到的问题
执行: mvn appfuse:full-source
[ERROR] 175002 : svn: PROPFIND request failed on '/svn/appfuse~svn/tags/APPFUSE_2.1.0/data/ibatis/src'
解决:
<groupId>org.appfuse.plugins</groupId>
<artifactId>appfuse-maven-plugin</artifactId>
<version>${appfuse.version}</version>
<configuration>
<genericCore>${amp.genericCore}</genericCore>
<fullSource>${amp.fullSource}</fullSource>
<trunk>https://svn.java.net/svn/appfuse~svn/</trunk>
</configuration>
即添加:
<trunk>https://svn.java.net/svn/appfuse~svn/</trunk>
保留上面配置执行: mvn appfuse:copy-templates
svn: PROPFIND request failed on '/svn/appfuse~svn/tags/APPFUSE_2.1.0/plugins/appfuse-maven-plugin/src/main/resources/appfuse/dao'
解决:
删除<trunk>https://svn.java.net/svn/appfuse~svn/</trunk>
<6> 环境:ibatis + oracle
[INFO] Preparing appfuse:gen-model
[INFO] [native2ascii:native2ascii {execution: native2ascii-utf8}]
[INFO] [native2ascii:native2ascii {execution: native2ascii-8859_1}]
[INFO] [resources:resources {execution: default-resources}]
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 42 resources
[INFO] Copying 16 resources
[INFO] Copying 8 resources
[INFO] Copying 16 resources
[INFO] Copying 16 resources
[WARNING] POM for 'org.apache.ibatis:ibatis-sqlmap:pom:${ibatis.version}:compile' i
Its dependencies (if any) will NOT be available to the current build.
[INFO] [appfuse:gen-model {execution: default-cli}]
[INFO] Writing 'hibernate.reveng.xml' to target\test-classes\hibernate.reveng.xml \\可见model的产生需要借助
hibernate.reveng.xml
<7>
HibernateException: Could not parse configuration: file:/D:/mavenTest/MyProj/src/main/resources/hibernate.cfg.xml
Caused by: org.dom4j.DocumentException: Connection timed out: connect Nested exception: Connection timed out: connect
at org.dom4j.io.SAXReader.read(SAXReader.java:484)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1518)
解决:
<!-- NOTE: If you're working offline, you might have to change the DOCTYPE to the following:
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">-->
《8》
[INFO] Request to merge when 'filtering' is not identical
解决:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.6</version></plugin> //2.8好像有问题
<plugin>
<9>
mvn appfuse:gen -Dentiry=Person 会生产Dao,service,..外, 还会生产相应的测试代码. 所以改变template要在这步
操作之前进行
<9>
[INFO] Unable to find resource 'org.codehaus.mojo:mojo-sandbox:pom:2-SNAPSHOT' in repository appfuse-snapshots (http://oss.sonatype.org/content/reposi
tories/appfuse-snapshots)
[INFO] ------------------------------------------------------------------------
原因: 自己不小心去掉了appfuse-maven-plugin <plugin> 的配置
<10.
[ERROR] 175002 : svn: PROPFIND request failed on '/svn/appfuse~svn/!svn/vcc/default'
[ERROR] 175002 : svn: can not read HTTP status line
[INFO] ------------------------------------------------------------------------
原因: 可能是网络问题, 过分吧钟在试
《9》
按官方说明来:用ibatis时,把hibernate3-maven-plugin 换成 sql-maven-plugin 出现生成xxxSQL.xml文件错误
如: <result property="userName" column="userName"/>
hibernate3-maven-plugin 后: <result property="userName" column="USER_NAME"/>正确
<10>
appfuse 代码的自动生成,jpa注解, hibernate3-maven-plugin 视乎不能少;
hibernate.reveng.xml 映射类型也不能少
<11>
appfuse,oracle,ibatis 时, 生成xxxSQL.xml 日期映射不正确.
如: <parameter property="birthdate" jdbcType="varchar" javaType="date"/>
解决:\MyProj\src\test\resources\appfuse\model\Ejb3PropertyGetAnnotation.ftl
注释:
<#-- ${pojo.generateBasicAnnotation(property)} -->
<12>
ERROR freemarker.runtime -
Method public java.lang.String org.hibernate.tool.hbm2x.pojo.EntityPOJOClass.generateJoinColumnsAnnotation
change ${pojo.generateJoinColumnsAnnotation(property)} to ${pojo.generateJoinColumnsAnnotation(property, cfg)} in Ejb3PropertyGetAnnotation.ftl
to have access to ftl files you have to get they with the appropriate goal appfuse:copy-templates
> mvn appfuse:gen-model with a db that as a table with a FK doesn't work
《13>
oracle, 务必要在jdbc.properties加:
hibernatetool.metadatadialect=org.hibernate.cfg.reveng.dialect.OracleMetaDataDialect
否则:hibernate.reveng.xml 设置的属性无法生效