首页 > 代码库 > 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,这也更符合实际开发的需要)。是的,看上去没有任何关系,但是问题就是出在了这里!下面我们回退到问题发生时一步步地进行排查。本文原文出处: 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=http://www.mamicode.com/"${project.build.filters}"/>>

这段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的兼容问题,这里我们不再深究,但是解决方法已经变得很清晰上,就是前文提到的做法。