千里之行,始于足下。结合例子学习概念,比较靠谱。本文介绍如何开始从appfuse开始学习Spring和Hibernate。
如果你还没有安装mysql,请先安装。同时也建议你安装一个workbench来方便管理数据库。
1. 利用Maven构建appfuse项目
万能的Maven提供了很多丰富的Archetype让你可以轻松构建一个包含了你想使用的框架的基本项目,而避免让你从零开始。你可以在这里(
http://docs.codehaus.org/display/MAVENUSER/Archetypes+List)查看Maven提供的所有Archetype。
在命令行输入下面的命令,你就可以根据向导生成一个appfuse框架了。
mvn archetype:generate
第一步就是选择Archetype。请输入:
org.appfuse.archetypes:appfuse-basic-spring
下面的步骤很直观,不再赘述。
或者用下面的命令一步搞定:
mvn archetype:generate -B -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-spring-archetype -DarchetypeVersion=2.1.0 -DgroupId=study.spring -DartifactId=appfuse -DarchetypeRepository=http://oss.sonatype.org/content/repositories/appfuse
2. 利用Eclipse的Maven插件m2eclipse,你可以导入刚刚创建的项目:appfuse。导入过程需要几分钟,maven需要下载一些依赖的lib。
产生的项目里面只有一个类:App,其他的类呢?原来默认生成的项目是嵌入式的,其他的类都作为jar被引入而非源代码。如果你想生成源代码在这个项目里面,可以这样:
mvn appfuse:full-source
你可能会遇到错误:
[ERROR] Failed to execute goal org.codehaus.mojo:appfuse-maven-plugin:2.0.2:full
-source (default-cli) on project appfuse: svn: PROPFIND request failed on '/svn/
appfuse/tags/APPFUSE_2.0.2/data/common/src'
[ERROR] svn: Connection refused: connect
添加:<trunk>https://svn.java.net/svn/appfuse~svn/</trunk>到下面的位置
<configuration>
<genericCore>${amp.genericCore}</genericCore>
<fullSource>${amp.fullSource}</fullSource>
<trunk>https://svn.java.net/svn/appfuse~svn/</trunk>
</configuration>
你可能会遇到错误:
[ERROR] Failed to execute goal org.codehaus.mojo:appfuse-maven-plugin:2.0.2:full
-source (default-cli) on project appfuse: Execution default-cli of goal org.code
haus.mojo:appfuse-maven-plugin:2.0.2:full-source failed: A required class was mi
ssing while executing org.codehaus.mojo:appfuse-maven-plugin:2.0.2:full-source:
org/codehaus/plexus/embed/Embedder
这个是因为不支持maven3,需要用maven2. 成功以后看看你的项目里面会多了很多包和类,这些就是appfuse的源代码了。
事情还没完,LabelTag会有编译错误:
The type org.springframework.core.env.EnvironmentCapable cannot be resolved. It is indirectly referenced from required .class files
这是因为spring版本需要升级,修改为:
<spring.version>3.1.1.RELEASE</spring.version>
3. 运行
输入下面的命令启动这个app:
mvn jetty:run
如果你遇到了这个错误(不知道这个算不算bug):
[ERROR] Failed to execute goal org.codehaus.mojo:aspectj-maven-plugin:1.0:compil
e (default) on project my-project-domain: The artifact org.springframework:sprin
g-aspects referenced in aspectj plugin as an aspect library, is not found the pr
oject dependencies -> [Help 1]
那么你需要添加spring-aspects dependency。(你可以利用maven插件工具查找并添加)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
再次运行,成功后在浏览器打开
http://localhost:8080.
默认有两个用户:admin/admin, user/user
4. 在Eclipse里面运行
配置Maven Build:
5. 加入debug和JMX远程监控参数
-server -Xms256m -Xmx256m -XX:PermSize=64m -XX:MaxPermSize=128m -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n -Dcom.sun.management.jmxremote.port=9000
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
加入这些JVM参数之后,就可以在eclipse里面debug了。同时可以用JConsole或JVisualVM来监控JVM了。
6. 配置log4j
Eclipse能显示的日志的大小是有限的,所以可以让日志写到文件里面以便分析。修改log4j.xml,添加FileAppender:
<appender name="FILE" class="org.apache.log4j.FileAppender">
<param name="File" value="appfuse.log"/>
<param name="Append" value="false" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%t %-5p %c{2} - %m%n"/>
</layout>
</appender>
<root>
<level value="TRACE"/>
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
修改spring的日志级别为TRACE:
<logger name="org.springframework">
<level value="TRACE"/>
</logger>
这样我们就能在项目根目录下面的appfuse.log里面看到非常详细的日志了。下一步就是要分析这个日志来看看Spring是怎么样工作的。
关于appfuse你可以参考:
http://appfuse.org/display/APF/AppFuse+QuickStart