GWT会在编译过程中删除未使用的类吗?

Kev*_*n K 0 java gwt gwt-compiler

假设我有一个大致如下所示的项目结构:

{module-package}.webapp  
    module.gwt.xml
{module-package}.webapp.client
    Client.java
    UsedByClient.java
    NotUsedByClient.java
Run Code Online (Sandbox Code Playgroud)

module.gwt.xml文件具有:

<source path='client'/>
<entry-point class='{module-package}.webapp.client.Client'/>
Run Code Online (Sandbox Code Playgroud)

当我使用GWT编译该项目时,有多少Java代码将被编译为Javascript?

  • NotUsedByClient.java包括在内,即使入口点不引用呢?
  • UsedByClient.java完全或部分包括在内?例如,如果它具有m()未被调用的方法,是否Clientm对其进行编译?

这样做的动机是,不幸的是,我正在使用一个遗留代码库,该遗留代码库在同一软件包中包含服务器端代码和客户端代码,因此将它们分开是一项工作。客户端未使用服务器端代码,但我担心GWT可能会将其编译为Javascript,从而使人可能注意到它并尝试对其进行反向工程。

Col*_*rth 5

以上所有以及更多发生的情况:

  • 未引用的类被删除
  • 未引用的方法和字段被删除
  • 常量可以内联
  • 可以简化对常量的各种操作(如!,==,+,&&等)(基于某些字段始终为null或true等)
  • 不可重写的方法可以成为最终方法...
  • ...并且在某些情况下,最终方法可能会被设置为静态(导致更小的callite,并且该方法内部没有“ this”引用)...
  • 内联小型且经常调用的静态方法

重复此过程,并跳过了更多优化,以进一步帮助删除大小代码。最后,所有类,方法,字段和局部变量都将以一种进一步减小输出大小的方式进行重命名,包括对输出中的方法进行重新排序,以便按长度对它们进行排序,从而使gzip可以更有效地压缩内容,从而客户端。

因此,虽然可以对代码的某些方面进行逆向工程(就像可以对任何机器代码进行逆向工程一样),但未引用的代码将不可用,并且甚至无法读取。