起步
使用appfuse的第一步自然是通过archetype:generate生成项目。这本不是一问题,官方的QuickStart:http://appfuse.org/display/APF/AppFuse+QuickStart 页面上给出了帮助我们生成archetype:generate命令行的工具,不幸的是这个页面引用了一些位于googleapis.com上的js文件,中国的小朋友们可能获取不了这些文件(原因你懂的),至少在写作这篇文章的时候googleapis.com是无法从国内访问的。如果缺少这些JS文件,页面就不能自动生成命令行了,虽然这个命令本身并不复杂,但是手写出它的archetypeRepository地址和archetypeArtifactId还是很费力的,下面给出四个示例,可依此为蓝本进行修改:
示例一:建立名称为demo的基于spring mvc+spring+hibernate的单一工程,appfuse版本:3.0.0
mvn archetype:generate -B -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-spring-archetype -DarchetypeVersion=3.0.0 -DgroupId=com.yourcompany -DartifactId=demo -DarchetypeRepository=https://oss.sonatype.org/content/repositories/appfuse
示例二:建立名称为demo的基于spring mvc+spring+hibernate的单一工程,appfuse版本:3.0.1-SNAPSHOT
mvn archetype:generate -B -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-spring-archetype -DarchetypeVersion=3.0.1-SNAPSHOT -DgroupId=com. yourcompany -DartifactId=demo -DarchetypeRepository=https://oss.sonatype.org/content/repositories/appfuse
示例三:建立名称为sample的基于spring mvc+spring+hibernate的多模块工程,appfuse版本:3.0.0
mvn archetype:generate -B -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-modular-spring-archetype -DarchetypeVersion=3.0.0 -DgroupId=com. yourcompany -DartifactId=sample -DarchetypeRepository=https://oss.sonatype.org/content/repositories/appfusec
示例四:建立名称为sample的基于spring mvc+spring+hibernate的多模块工程,appfuse版本:3.0.1-SNAPSHOT
mvn archetype:generate -B -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-modular-spring-archetype -DarchetypeVersion=3.0.1-SNAPSHOT -DgroupId=com. yourcompany -DartifactId=sample -DarchetypeRepository=https://oss.sonatype.org/content/repositories/appfusec
生成项目之后,按照官方文档的指导很容易就可以build并运行新建立起来的工程了,但是如果你不走运的话,就可能会遇到如下一些问题:
问题与解决方法
问题一:
使用3.0.0版本,执行mvn appfuse:full-source失败,使用 mvn appfuse:full-source -e查看错误信息,报如下错误:
[ERROR] Failed to execute goal org.appfuse.plugins:appfuse-maven-plugin:3.0.0:full-source (default-cli) on project demo: Execution default-cli of
goal org.appfuse.plugins:appfuse-maven-plugin:3.0.0:full-source failed: java.net.UnknownHostException: raw.github.com: Unknown host raw.github.com
解决方法:
对于该问题,appfuse的作者在http://appfuse.547863.n4.nabble.com/Appfuse-failed-to-get-full-source-td4657086.html 中给出了解释,原因是github更改的子域名导致的。为此作者新建了一个3.0.1-SNAPSHOT版本来解决这一问题。就我个人的使用情况来看这是一个很奇怪的问题,第一次执行mvn appfuse:full-source确实遇到了这一问题,第二天就没有问题了,理论上raw.github.com会重定向到新的目标域名,但是看起来受到网络以及配置的种种原因,这个问题确实是有可能发生的。不过使用3.0.1-SNAPSHOT版本并非是一个好的解决方法,接下来的常见问题二就是发生在3.0.1-SNAPSHOT版本上的。
问题二:
使用3.0.1-SNAPSHOT版本,执行mvn jetty:run时报如下错误:
java.lang.IllegalStateException: org.slf4j.LoggerFactory could not be successfully initialized.解决方法:
这个问题确实是开发者给使用者挖的一个“坑”,仅仅从报错日志上很难找到直接原因,但是日志中的一行信息:
An API incompatibility was encountered while executing org.eclipse.jetty:jetty-maven-plugin:xxxxxx:run: java.lang.ExceptionInInitializerError: null
多少还是给了我们一些线索,检查使用3.0.1-SNAPSHOT版本生成的pom.xml文件,我们发现jetty插件的配置是这样的:
<plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>8.1.14.v20131031</version> <configuration> <webApp> <contextPath>/</contextPath> </webApp> </configuration> </plugin>
再仔细地检查,我们就会发现jetty迁移eclipse之后,其版本是从9.0.0开始的,根本没有8.1.14.v20131031这个版本,而这个8.1.14.v20131031版本是怎么来的呢?看看3.0.0的pom.xml我们找到了答案:
<plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>8.1.14.v20131031</version> <configuration> <webApp> <contextPath>/</contextPath> </webApp> </configuration> </plugin>
8.X版本的jetty还是其在mortbay下时的版本。很显然,作者在从3.0.0向3.0.1-SNAPSHOT升级的时候,配错了jetty的版本!这样,解决方法也就出来了,把插件配置中的<groupId>org.eclipse.jetty</groupId>改为<groupId>org.mortbay.jetty</groupId>就可以了。
建议
由于3.0.1-SNAPSHOT尚处于开发阶段,在不同时期使用可能会出现不同的问题,前文提及的第二个问题就是一个例子,因此建议先使用3.0.0版。