使用AppFuse1.8.2遇到的问题
内容提要
这个部分将说明使用AppFuse1.8.2遇到的问题以及如何解决这些问题。
- 我会用这种格式说明我在 实际过程 中的操作。
目录
- 导入Eclipse以后无法编译
- 运行ant setup-db无法正确创建数据库
- 使用ant deploy无法发布应用
- 中文乱码问题
- 我实际使用的是webwork+spring+ hibernate遇到的,可能有些地方与默认的struts+spring+hibernate不一样,有些问题是使用了webwork引出的。使用本文提供的例子需要在创建自己的应用后运行ant install-webwork。
导入Eclipse以后有无法编译
在Eclipse中将新创建的Myapp工程导入(import)后,Eclipse提示struts.jar和struts-el.jar两个包找不到。需要手工在Eclipse中把工程对这两个包的引用移除掉。
另外webwork相关的包引用没有添加到工程中,需要手工加入。至此Eclipse可以正常编译整个工程。
如果想彻底解决这个问题,应该考虑修改install-webwork任务。这个问题对使用影响不大,所以我就没有研究了。:-)
运行ant setup-db无法正确创建数据库
会出现app_user表无法创建的错误:
[schemaexport] (hbm2ddl.SchemaExport 167 ) Unsuccessful: create table app_user (username varchar(20) not null, version integer not null, password varchar(255) not null, first_name varchar(50) not null, last_name varchar(50) not null, address varchar(150), city varchar(50) not null, province varchar(100), country varchar(100), postal_code varchar(15) not null, email varchar(255) notnull unique, phone_number varchar(255), website varchar(255), password_hint varchar(255), enabled bit, primary key (username))[schemaexport] (hbm2ddl.SchemaExport 168 ) Specified key was too long. Max key length is 500
具体错误和解决办法可以参考AppFuse实践一——配置安装
。
- AppFuse 1.8.1因为DBUnit的关系也会出现无法创建表的问题,这个问题在1.8.2已经改过来了。
使用ant deploy无法发布应用
运行ant setup-db创建数据库,运行ant setup-tomcat正确配置Tomcat以后,运行ant deploy发布应用会碰到下面的问题:
BUILD FAILEDC:\Myapp\build.xml:285: xdoclet.XDocletException: Couldn't find template: C:\Myapp\metadata\templates\struts_form.xdt
检查build.xml 285行,发现下面的的关于gen-forms的ant任务定义
<!-- Generate ActionForms from POJOs --> <target name="gen-forms" depends="prepare" unless="webdoclet.uptodate" description="Generates ActionForms from POJOs"> <taskdef name="xdoclet" classname="xdoclet.DocletTask" classpathref="xdoclet.classpath"/> <!-- generate struts forms --> <xdoclet destdir="${build.dir}/web/gen" excludedtags="@version,@author" addedtags="@xdoclet-generated at ${TODAY}" force="${xdoclet.force}" mergedir="metadata/web"> <fileset dir="src/dao"/> <!-- generate struts forms --> <actionform templateFile="metadata/templates/struts_form.xdt"> <packageSubstitution packages="model" substituteWith="webapp.form"/> </actionform> </xdoclet> </target>这个任务是使用struts用到的,使用webwork不需要用,去掉compile-web任务对gen-forms的引用,把build.xml文件中的的296行
<target name="compile-web" depends="package-service,stage-web,gen-forms" description="Compile web module">
修改成
<target name="compile-web" depends="package-service,stage-web" description="Compile web module">
然后再运行ant deploy,出现好多错
compile-web: [echo] Compiling web... [mkdir] Created dir: C:\myfile\Myapp\build\test\web\classes [javac] Compiling 23 source files to C:\myfile\Myapp\build\web\classes [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\BaseAction.java:21: package com.opensymphony.webwork does not exist [javac] import com.opensymphony.webwork.ServletActionContext; [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\BaseAction.java:22: package com.opensymphony.xwork does not exist [javac] import com.opensymphony.xwork.ActionSupport; [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\BaseAction.java:37: cannot resolve symbol [javac] symbol : class ActionSupport [javac] location: class com.vicfuture.webapp.action.BaseAction [javac] public class BaseAction extends ActionSupport { [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\FileUploadAction.java:11: package com.opensymphony.webwork does not exist [javac] import com.opensymphony.webwork.ServletActionContext; [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\FileUploadAction.java:12: package com.opensymphony.xwork does not exist [javac] import com.opensymphony.xwork.ValidationAware; [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\FileUploadAction.java:14: cannot resolve symbol [javac] symbol : class ValidationAware [javac] location: class com.vicfuture.webapp.action.FileUploadAction [javac] public class FileUploadAction extends BaseAction implements ValidationAware { [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\ReloadAction.java:16: package com.opensymphony.webwork does not exist [javac] import com.opensymphony.webwork.ServletActionContext; [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\SignupAction.java:13: package com.opensymphony.webwork does not exist [javac] import com.opensymphony.webwork.ServletActionContext; [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\UserAction.java:19: package com.opensymphony.webwork does not exist [javac] import com.opensymphony.webwork.ServletActionContext; [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ExceptionHandlerInterceptor.java:11: package com.opensymphony.webwork does not exist [javac] import com.opensymphony.webwork.ServletActionContext; [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ExceptionHandlerInterceptor.java:12: package com.opensymphony.xwork does not exist [javac] import com.opensymphony.xwork.ActionInvocation; [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ExceptionHandlerInterceptor.java:13: package com.opensymphony.xwork.interceptor does not exist [javac] import com.opensymphony.xwork.interceptor.Interceptor; [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ExceptionHandlerInterceptor.java:24: cannot resolve symbol [javac] symbol : class Interceptor [javac] location: class com.vicfuture.webapp.interceptor.ExceptionHandlerInterceptor [javac] public class ExceptionHandlerInterceptor implements Interceptor { [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ExceptionHandlerInterceptor.java:51: cannot resolve symbol [javac] symbol : class ActionInvocation [javac] location: class com.vicfuture.webapp.interceptor.ExceptionHandlerInterceptor [javac] public String intercept(ActionInvocation invocation) [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\UserRoleAuthorizationInterceptor.java:9: package com.opensymphony.webwork does not exist [javac] import com.opensymphony.webwork.ServletActionContext; [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\UserRoleAuthorizationInterceptor.java:10: package com.opensymphony.xwork does not exist [javac] import com.opensymphony.xwork.ActionInvocation; [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\UserRoleAuthorizationInterceptor.java:11: package com.opensymphony.xwork.interceptor does not exist [javac] import com.opensymphony.xwork.interceptor.Interceptor; [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\UserRoleAuthorizationInterceptor.java:24: cannot resolve symbol [javac] symbol : class Interceptor [javac] location: class com.vicfuture.webapp.interceptor.UserRoleAuthorizationInterceptor [javac] public class UserRoleAuthorizationInterceptor implements Interceptor { [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\UserRoleAuthorizationInterceptor.java:27: cannot resolve symbol [javac] symbol : class ActionInvocation [javac] location: class com.vicfuture.webapp.interceptor.UserRoleAuthorizationInterceptor [javac] public String intercept(ActionInvocation invocation) throws Exception { [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ValidationInterceptor.java:5: package com.opensymphony.webwork does not exist [javac] import com.opensymphony.webwork.ServletActionContext; [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ValidationInterceptor.java:6: package com.opensymphony.xwork does not exist [javac] import com.opensymphony.xwork.Action; [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ValidationInterceptor.java:7: package com.opensymphony.xwork does not exist [javac] import com.opensymphony.xwork.ActionContext; [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ValidationInterceptor.java:8: package com.opensymphony.xwork does not exist [javac] import com.opensymphony.xwork.ActionInvocation; [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ValidationInterceptor.java:9: package com.opensymphony.xwork.interceptor does not exist [javac] import com.opensymphony.xwork.interceptor.AroundInterceptor; [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ValidationInterceptor.java:10: package com.opensymphony.xwork.validator does not exist [javac] import com.opensymphony.xwork.validator.ActionValidatorManager; [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ValidationInterceptor.java:17: cannot resolve symbol [javac] symbol : class AroundInterceptor [javac] location: class com.vicfuture.webapp.interceptor.ValidationInterceptor [javac] public class ValidationInterceptor extends AroundInterceptor { [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ValidationInterceptor.java:19: cannot resolve symbol [javac] symbol : class ActionInvocation [javac] location: class com.vicfuture.webapp.interceptor.ValidationInterceptor [javac] protected void after(ActionInvocation dispatcher, String result) throws Exception { [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\interceptor\ValidationInterceptor.java:22: cannot resolve symbol [javac] symbol : class ActionInvocation [javac] location: class com.vicfuture.webapp.interceptor.ValidationInterceptor [javac] protected void before(ActionInvocation invocation) throws Exception { [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\BaseAction.java:39: cannot resolve symbol [javac] symbol : method getClass () [javac] location: class com.vicfuture.webapp.action.BaseAction [javac] protected transient final Log log = LogFactory.getLog(getClass()); [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\BaseAction.java:90: cannot resolve symbol [javac] symbol : variable ServletActionContext [javac] location: class com.vicfuture.webapp.action.BaseAction [javac] return ServletActionContext.getRequest(); [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\BaseAction.java:98: cannot resolve symbol [javac] symbol : variable ServletActionContext [javac] location: class com.vicfuture.webapp.action.BaseAction [javac] return ServletActionContext.getResponse(); [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\FileUploadAction.java:27: cannot resolve symbol [javac] symbol : variable ServletActionContext [javac] location: class com.vicfuture.webapp.action.FileUploadAction [javac] ServletActionContext.getServletContext().getRealPath("/resources") + [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\FileUploadAction.java:63: cannot resolve symbol [javac] symbol : variable SUCCESS [javac] location: class com.vicfuture.webapp.action.FileUploadAction [javac] return SUCCESS; [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\FileUploadAction.java:67: cannot resolve symbol [javac] symbol : variable INPUT [javac] location: class com.vicfuture.webapp.action.FileUploadAction [javac] return INPUT; [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\PasswordHintAction.java:41: cannot resolve symbol [javac] symbol : method getText (java.lang.String) [javac] location: class com.vicfuture.webapp.action.PasswordHintAction [javac] args.add(getText("user.username")); [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\PasswordHintAction.java:42: cannot resolve symbol [javac] symbol : method getText (java.lang.String,java.util.List) [javac] location: class com.vicfuture.webapp.action.PasswordHintAction [javac] addActionError(getText("errors.required", args)); [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\PasswordHintAction.java:43: cannot resolve symbol [javac] symbol : variable INPUT [javac] location: class com.vicfuture.webapp.action.PasswordHintAction [javac] return INPUT; [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\PasswordHintAction.java:58: cannot resolve symbol [javac] symbol : method getText (java.lang.String) [javac] location: class com.vicfuture.webapp.action.PasswordHintAction [javac] String subject = getText("webapp.prefix") + getText("user.passwordHint"); [javac] ^ [javac] C:\myfile\Myapp\src\web\com\vicfuture\webapp\action\PasswordHintAction.java:58: cannot resolve symbol [javac] symbol : method getText (java.lang.String) [javac] location: class com.vicfuture.webapp.action.PasswordHintAction [javac] String subject = getText("webapp.prefix") + getText("user.passwordHint"); [javac] ^ [javac] The system is out of resources. [javac] Consult the following stack trace for details. [javac] java.lang.OutOfMemoryErrorBUILD FAILED肯定是编译路径中没有加入webwork相关包的引用!手工修改Myapp目录下面properties.xml文件,加入webwork相关包的引用,在properties.xml文件第146行后面加上新的一行
<fileset dir="${webwork.dir}" includes="*.jar"/>然后运行ant deploy 还是出错
BUILD FAILEDC:\myfile\Myapp\build.xml:54: C:\myfile\Myapp\build\web\gen not found.
去掉build.xml第54行
<srcfiles dir="${build.dir}/web/gen" includes="**/*.java"/>还有第320行
<fileset dir="${build.dir}/web/gen"/>- 实际上把这两句注释掉就可以了,这个是前面那个gen-forms任务用到的输出目录。
运行ant deloy,启动tomcat,可以正常工作了!
中文乱码问题
界面上可以看到中文字符无法正常显示,有很多“?”。
怀疑是ApplicationResources_zh_CN.properties文件有问题,用eclipse打开编辑(在web\WEB-INF\classes目录下),果然看到是乱码。把早期版本的文件内容copy过来覆盖重新发布,一切正常了!
Trackback: http://tb.donews.net/TrackBack.aspx?PostId=618941