AppFuse 3常見問題與解決方法
起步
使用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的單一project,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的單一project,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的多模塊project。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的多模塊project,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
生成項目之後。依照官方文檔的指導非常easy就能夠build並運行新建立起來的project了。可是假設你不走運的話,就可能會遇到例如以下一些問題:
問題與解決方法
問題一:
使用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>就能夠了。
問題三:
亂碼
解決方法:
請參考還有一篇文章:AppFuse 3的亂碼問題
建議
因為3.0.1-SNAPSHOT尚處於開發階段,在不同一時候期使用可能會出現不同的問題,前文提及的第二個問題就是一個樣例,因此建議先使用3.0.0版。
AppFuse 3常見問題與解決方法