AppFuse是一個使用java語言開發web應用系統的集成框架。java開發人員最頭痛的事情就是面對大量的框架不知該如何選擇。這些框架性能如何,兼容性如何等等都需要篩選比較。Appfuse作者Matt Raible對于這些框架做了深入研究,把這些框架中最優秀的部分拿出來集成到一起,形成了最優秀的集成框架。目前這個框架的最新穩定版本是3.5.
AppFuse中的基礎框架:
AppFuse提供了許多應用需要的開箱即用的功能,包括:
最新的AppFuse和Maven關系緊密。幾乎所有的操作都通過Maven來執行,所以要對Maven以及模塊化開發有一定的了解,對Maven profiles有比較深入的了解,對Maven的倉庫結構也需要有一定了解。
AppFuse支持多種數據庫(Derby、H2、HSQLDB、MySQL、Oracle、PostgreSQL、SQL Server),默認數據庫是MySQL。在我切換到Oracle數據庫的時候,發現了一下問題,才有了此文。下面我介紹發現的問題和解決方法。
1.首先下載安裝Maven 3.1.0+,網上有很多教程,這里就不贅述了。當然,你還需要JDK7+,MySQL 5.5+ 。
2.使用Maven生成包含AppFuse框架的空項目:
mvn archetype:generate -B -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-modular-spring-archetype -DarchetypeVersion=3.5.0 -DgroupId=com.myCompany.myProject-DartifactId=myProject -DarchetypeRepository=https://oss.sonatype.org/content/repositories/appfuse
首先解釋一下:這是個mvn生成(archetype:generate)框架代碼的命令,后續會用到。其中myCompany是公司名稱,myProject是項目名稱。AppFuse版本是3.5.0。最關鍵的部分是appfuse-modular-spring-archetype,modular代表多模塊,spring代表前段框架是spring MVC。
啟動命令行(cmd)。修改當前目錄到Java的workspace(你想要放置代碼的目錄)。輸入上面的一大串以mvn開頭的字符,回車。由于天朝眾人皆知的原因和Google的退出,有些jar包可能找不到源頭,可能你被迫必須FQ(FreeGate)才能完成這個命令。也可能由于網速太慢,下載超時,你需要反復嘗試上面的命令。
總之,需要艱辛的努力,還可能需要一些非常規手段。。。
神奇的事情發生了,你發現你的workspace下面多了一個文件夾。
別著急,你還需要小小的幾步。
3.下載框架中用到的源代碼和模板。
mvn appfuse:full-source
這個時候如果系統運行環境JDK和數據庫MySql(root的密碼為空)已經準備好,就可以到web目錄下運行命令mvn jetty:run部署啟動項目,登錄http://localhost:8080訪問你的項目了!
4.生成項目文件。
命令行當前目錄切換到myproject目錄下。如果你使用的是eclipse,你可以運行:mvn eclipse:eclipse 命令。如果你使用的是idea,運行:mvn idea:idea。項目文件和相關依賴會生成。
5.切換到Oracle數據庫。
AppFuse為我們準備了多款數據庫選擇(profiles)。查看這些profiles,可以鍵入以下命令:
mvn help:full-profiles
顯示全部可以profiles。
mvn help:active-profiles
顯示激活的profiles。
本來事情很簡單,我們只需要執行以下命令即可切換到oracle.
mvn clean install -P oracle
清除項目生成的文件,并安裝oracle Profile。
但執行過程中報了三個錯誤,導致執行失敗。
問題1:找不到odbc jar包。
我們到Maven的倉庫中找到oracle相關的倉庫:C:/Users/[localUser]/.m2/repository/com/oracle/ojdbc14/10.2.0.2.0。這個倉庫是由AppFuse生成的,但下面缺少Jar包。我們需要從Oracle網站上下載一個10.2.0.2.0版本對應的ojdbc14-.jar放到這個目錄下面,并且改名為:ojdbc14-10.2.0.2.0.jar。
也有人覺得現在oracle版本已經12了,還用10的驅動,有點過時。你可以安裝自己的oracle庫。方法是下載oracle相應jar,執行maven命令安裝jdbc依賴。我正好安裝了oracle數據庫11.2G,就用它的驅動了,省的下載。
mvn install:install-file -Dfile=C:/app/[localUser]/product/11.2.0/dbhome_1/jdbc/lib/ojdbc6_g.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0 -Dpackaging=jar
如果你本機沒有裝Oracle,或者全局數據庫名不是XE,你可能需要修改默認的數據庫連接選項。打開文件:C:/Users/[localUser]/.m2/repository/org/appfuse/appfuse/3.5.0/appfuse-3.5.0.pom。做好備份。找到oracle相關的profile,修改成下面的樣子:
<profile> <id>oracle</id> <properties> <dbunit.dataTypeFactoryName>org.dbunit.ext.oracle.OracleDataTypeFactory</dbunit.dataTypeFactoryName> <dbunit.schema>MYPROJECT</dbunit.schema> <!-- Make sure to capitalize the schema name --> <!--<dbunit.Operation.type>CLEAN_INSERT</dbunit.operation.type>--> <hibernate.dialect>org.hibernate.dialect.Oracle10gDialect</hibernate.dialect> <hibernate.export.schema.delimiter></hibernate.export.schema.delimiter> <jdbc.groupId>com.oracle</jdbc.groupId> <jdbc.artifactId>ojdbc6</jdbc.artifactId> <jdbc.version>11.2.0</jdbc.version> <jdbc.driverClassName>oracle.jdbc.OracleDriver</jdbc.driverClassName> <jdbc.url><![CDATA[jdbc:oracle:thin:@localhost:1521:Orcl]]></jdbc.url> <jdbc.username>myproject</jdbc.username> <jdbc.passWord>myproject</jdbc.password> <jdbc.validationQuery><![CDATA[SELECT 1 + 1 from DUAL]]></jdbc.validationQuery> </properties> </profile>
其中myproject是我專門為該項目創建的數據庫。本機數據庫的全局實例名是orcl。jdbc也改成了11.2的。還有一些更改后續會提到。
問題2:數據庫腳本無法執行。到myproject/core/target目錄下,找到schema.sql。打開查看,發現一切正常,你到sqlplus下面執行這個sql文件也沒有問題。
文件發生的原因是這個sql不是由sqlplus執行的,而是2.有hibernate執行的!hibernate執行sql語句的時候,不能有段落結束符合“;”。所以報錯!解決辦法是在appfuse-3.5.0.pom中的oracle profile中增加一個設置,把段落分割符設置成空:
<hibernate.export.schema.delimiter></hibernate.export.schema.delimiter>
這樣問題就解決了!
問題3:單元測試不能通過。報一個奇怪的錯誤:
Tests run: 9, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 2.167 sec <<< FAILURE! testUpdateUser(com.exam.dao.UserDaoTest) Time elapsed: 0.088 sec <<< ERROR! java.lang.Exception: Unexpected exception, expected<org.springframework.dao.DataIntegrityViolationException>but was<org.springframework.orm.hibernate4.HibernateSystemException>
這個問題已經被提交到AppFuse的郵件列表中,但是還沒有正面的回復,只有一個規避的辦法。深層次的原因需要有能力的人繼續挖掘!
規避辦法是注釋掉測試代碼UserDaoTest.java的第68行://user2.setRoles(user.getRoles());
user2.setLastName(user.getLastName()); user2.setPassword(user.getPassword()); user2.setPasswordHint(user.getPasswordHint()); //user2.setRoles(user.getRoles()); user2.setUsername(user.getUsername()); user2.setWebsite(user.getWebsite());
修改了這幾個問題,oracle profile就會成功激活,測試通過并生成jar包、war包。
另外,我修改oracle數據庫profile(appfuse-3.5.0.pom)的方式比較不可取,更科學的方式是修改myproject下面的pom.xml.
<properties> ...其他設置 <!-- 為鏈接oracle數據庫添加了以下設置項,這些設置項的默認值指向mysql數據庫 --> <dbunit.dataTypeFactoryName>org.dbunit.ext.oracle.OracleDataTypeFactory</dbunit.dataTypeFactoryName> <dbunit.schema>MYPROJECT</dbunit.schema> <hibernate.dialect>org.hibernate.dialect.Oracle10gDialect</hibernate.dialect> <jdbc.groupId>com.oracle</jdbc.groupId> <jdbc.artifactId>ojdbc6</jdbc.artifactId> <jdbc.version>11.2.0</jdbc.version> <jdbc.driverClassName>oracle.jdbc.OracleDriver</jdbc.driverClassName> <jdbc.url><![CDATA[jdbc:oracle:thin:@localhost:1521:Orcl]]></jdbc.url> <jdbc.username>myproject</jdbc.username> <jdbc.password>myproject</jdbc.password> <jdbc.validationQuery><![CDATA[SELECT 1 + 1 from DUAL]]></jdbc.validationQuery> </properties>
新聞熱點
疑難解答