AppFuse 3的乱码问题

今日长缨在手,何时缚住苍龙。这篇文章主要讲述AppFuse 3的乱码问题相关的知识,希望能为你提供帮助。
书接上回:AppFuse 3常见问题与解决方法 ,一个新问题:乱码! 在3.0.0版本号下,运行mvn appfuse:full-source命令后使用mvn jetty:run启动工程,页面上就出现了乱码。我要说的是这个乱码问题很有趣,它的有趣之处在于最后的解决方法看上去与问题差的太远。这个解决方法是:找到pom中对hibernate3-maven-plugin的配置,将当中的< executions/> 部分凝视掉,即不在process-test-resources阶段运行hbm2ddl。
(假设你须要导出schema到数据库,能够手动运行mvn hibernate3:hbm2ddl,这也更符合实际开发的须要)。是的,看上去没有不论什么关系。可是问题就是出在了这里!以下我们回退到问题发生时一步步地进行排查。对于本文列出之外的一些细节问题,能够參考:基于Appfuse 2.1高速构建工程的注意事项 本文原文出处:  http://blog.csdn.net/bluishglc/article/details/38640715 严禁不论什么形式的转载,否则将托付CSDN官方维护权益!


首先,查看编译之后的输出文件夹target/classes下的中文properties文件。能够确定这件文件本身就没有转码,是native2ascii插件没有正常工作吗?通过检查。发现问题不在native2ascii-maven-plugin的配置上。使用mvn clean package -X查看maven运行过程中的log信息,发现了以下一段有趣的输出:

[DEBUG] ----------------------------------------------------------------------- [DEBUG] Goal:org.apache.maven.plugins:maven-resources-plugin:2.6:resources (default-resources) [DEBUG] Style:Regular [DEBUG] Configuration: < ?
xml version=" 1.0" encoding=" UTF-8" ?> < configuration> < buildFilters default-value=https://www.songbingjia.com/android/" ${project.build.filters}" /> < encoding default-value=" ${project.build.sourceEncoding}" > ${encoding}< /encoding> < escapeString> ${maven.resources.escapeString}< /escapeString> < escapeWindowsPaths default-value=" true" > ${maven.resources.escapeWindowsPaths}< /escapeWindowsPaths> < includeEmptyDirs default-value=" false" > ${maven.resources.includeEmptyDirs}< /includeEmptyDirs> < outputDirectory default-value=" ${project.build.outputDirectory}" /> < overwrite default-value=" false" > ${maven.resources.overwrite}< /overwrite> < project default-value=" ${project}" /> < resources default-value=" ${project.resources}" /> < session default-value=" ${session}" /> < supportMultiLineFiltering default-value=" false" > ${maven.resources.supportMultiLineFiltering}< /supportMultiLineFiltering> < useBuildFilters default-value=" true" /> < useDefaultDelimiters default-value=" true" /> < /configuration> [DEBUG] ----------------------------------------------------------------------- [DEBUG] Goal:org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) [DEBUG] Style:Regular [DEBUG] Configuration: < ?
【AppFuse 3的乱码问题】xml version=" 1.0" encoding=" UTF-8" ?> < configuration> < basedir default-value=https://www.songbingjia.com/android/" ${basedir}" /> < buildDirectory default-value=" ${project.build.directory}" /> < classpathElements default-value=" ${project.compileClasspathElements}" /> < compileSourceRoots default-value=" ${project.compileSourceRoots}" /> < compilerId default-value=" javac" > ${maven.compiler.compilerId}< /compilerId> < compilerReuseStrategy default-value=" ${reuseCreated}" > ${maven.compiler.compilerReuseStrategy}< /compilerReuseStrategy> < compilerVersion> ${maven.compiler.compilerVersion}< /compilerVersion> < debug default-value=" true" > ${maven.compiler.debug}< /debug> < debuglevel> ${maven.compiler.debuglevel}< /debuglevel> < encoding default-value=" ${project.build.sourceEncoding}" > ${encoding}< /encoding> < executable> ${maven.compiler.executable}< /executable> < failOnError default-value=" true" > ${maven.compiler.failOnError}< /failOnError> < forceJavacCompilerUse default-value=" false" > ${maven.compiler.forceJavacCompilerUse}< /forceJavacCompilerUse> < fork default-value=" false" > ${maven.compiler.fork}< /fork> < generatedSourcesDirectory default-value=" ${project.build.directory}/generated-sources/annotations" /> < maxmem> ${maven.compiler.maxmem}< /maxmem> < meminitial> ${maven.compiler.meminitial}< /meminitial> < mojoExecution> ${mojoExecution}< /mojoExecution> < optimize default-value=" false" > ${maven.compiler.optimize}< /optimize> < outputDirectory default-value=" ${project.build.outputDirectory}" /> < projectArtifact default-value=" ${project.artifact}" /> < showDeprecation default-value=" false" > ${maven.compiler.showDeprecation}< /showDeprecation> < showWarnings default-value=" false" > ${maven.compiler.showWarnings}< /showWarnings> < skipMain> ${maven.main.skip}< /skipMain> < skipMultiThreadWarning default-value=" false" > ${maven.compiler.skipMultiThreadWarning}< /skipMultiThreadWarning> < source default-value=" 1.5" > 1.7< /source> < staleMillis default-value=" 0" > ${lastModGranularityMs}< /staleMillis> < target default-value=" 1.5" > 1.7< /target> < useIncrementalCompilation default-value=" true" > ${maven.compiler.useIncrementalCompilation}< /useIncrementalCompilation> < verbose default-value=" false" > ${maven.compiler.verbose}< /verbose> < mavenSession default-value=" ${session}" /> < session default-value=" ${session}" /> < /configuration> [DEBUG] ----------------------------------------------------------------------- [DEBUG] Goal:org.codehaus.mojo:native2ascii-maven-plugin:1.0-beta-1:native2ascii (native2ascii-utf8) [DEBUG] Style:Regular [DEBUG] Configuration: < ?xml version=" 1.0" encoding=" UTF-8" ?> < configuration> < encoding default-value=" ${project.build.sourceEncoding}" > UTF8< /encoding> < includes> < include> ApplicationResources_zh*.properties< /include> < include> displaytag_zh*.properties< /include> < /includes> < tempDir default-value=" ${project.build.directory}" /> < workDir default-value=" ${project.build.outputDirectory}" /> < /configuration> [DEBUG] ----------------------------------------------------------------------- [DEBUG] Goal:org.apache.maven.plugins:maven-resources-plugin:2.6:testResources (default-testResources) [DEBUG] Style:Regular [DEBUG] Configuration: < ?xml version=" 1.0" encoding=" UTF-8" ?
> < configuration> < buildFilters default-value=https://www.songbingjia.com/android/" ${project.build.filters}" /> < encoding default-value=" ${project.build.sourceEncoding}" > ${encoding}< /encoding> < escapeString> ${maven.resources.escapeString}< /escapeString> < escapeWindowsPaths default-value=" true" > ${maven.resources.escapeWindowsPaths}< /escapeWindowsPaths> < includeEmptyDirs default-value=" false" > ${maven.resources.includeEmptyDirs}< /includeEmptyDirs> < outputDirectory default-value=" ${project.build.testOutputDirectory}" /> < overwrite default-value=" false" > ${maven.resources.overwrite}< /overwrite> < project default-value=" ${project}" /> < resources default-value=" ${project.testResources}" /> < session default-value=" ${session}" /> < skip> ${maven.test.skip}< /skip> < supportMultiLineFiltering default-value=" false" > ${maven.resources.supportMultiLineFiltering}< /supportMultiLineFiltering> < useBuildFilters default-value=" true" /> < useDefaultDelimiters default-value=" true" /> < /configuration> [DEBUG] --- init fork of com.github:demo:1.0-SNAPSHOT for org.codehaus.mojo:hibernate3-maven-plugin:2.2:hbm2ddl (default) --- [DEBUG] Dependencies (collect): [] [DEBUG] Dependencies (resolve): [] [DEBUG] ----------------------------------------------------------------------- [DEBUG] Goal:org.apache.maven.plugins:maven-resources-plugin:2.6:resources (default-resources) [DEBUG] Style:Regular [DEBUG] Configuration: < ?
xml version=" 1.0" encoding=" UTF-8" ?> < configuration> < buildFilters default-value=https://www.songbingjia.com/android/" ${project.build.filters}" /> < encoding default-value=" ${project.build.sourceEncoding}" > ${encoding}< /encoding> < escapeString> ${maven.resources.escapeString}< /escapeString> < escapeWindowsPaths default-value=" true" > ${maven.resources.escapeWindowsPaths}< /escapeWindowsPaths> < includeEmptyDirs default-value=" false" > ${maven.resources.includeEmptyDirs}< /includeEmptyDirs> < outputDirectory default-value=" ${project.build.outputDirectory}" /> < overwrite default-value=" false" > ${maven.resources.overwrite}< /overwrite> < project default-value=" ${project}" /> < resources default-value=" ${project.resources}" /> < session default-value=" ${session}" /> < supportMultiLineFiltering default-value=" false" > ${maven.resources.supportMultiLineFiltering}< /supportMultiLineFiltering> < useBuildFilters default-value=" true" /> < useDefaultDelimiters default-value=" true" /> < /configuration> [DEBUG] --- exit fork of com.github:demo:1.0-SNAPSHOT for org.codehaus.mojo:hibernate3-maven-plugin:2.2:hbm2ddl (default) ---


这段log的有趣之处在于:resources:resources 被运行了两次。第一次是在native2ascii:native2ascii之前,第二次是在 native2ascii:native2ascii 运行之后运行hbm2ddl时又被又一次调用了一次。为了准确地了解resources:resources和native2ascii:native2ascii的运行顺序,我们从它们各自的文档上找到它们默认绑定的周期说明:

resources:resources -> process-resources

native2ascii:native2ascii -> process-classes

maven的默认生命周期例如以下:   


< phases> < phase> validate< /phase> < phase> initialize< /phase> < phase> generate-sources< /phase> < phase> process-sources< /phase> < phase> generate-resources< /phase> < phase> process-resources< /phase> < phase> compile< /phase> < phase> process-classes< /phase> < phase> generate-test-sources< /phase> < phase> process-test-sources< /phase> < phase> generate-test-resources< /phase> < phase> process-test-resources< /phase> < phase> test-compile< /phase> < phase> process-test-classes< /phase> < phase> test< /phase> < phase> prepare-package< /phase> < phase> package< /phase> < phase> pre-integration-test< /phase> < phase> integration-test< /phase> < phase> post-integration-test< /phase> < phase> verify< /phase> < phase> install< /phase> < phase> deploy< /phase> < /phases>



依照正常的逻辑, resources:resources会先于native2ascii:native2ascii将全部指定的resource文件进行filter处理之后放置于target文件夹下,之后native2ascii:native2ascii跟进。对指定的文件进行转码。这是很合理的处理方式,而我们的问题就出如今了对resources:resources第二次不正常的调用,这导致了之前经过转码的文件又被未经转码的文件覆盖了。从日志上看,导致resources:resources第二次运行的原因应该是在进入process-test-resources阶段后运行hbm2ddl触发的。也就是说是hbm2ddl的某个动作主动调用了resources:resources,至于详细的细节。是bug还是与maven3的兼容问题,这里我们不再深究,可是解决方法已经变得很清晰上,就是前文提到的做法。



    推荐阅读