确定是否从GWT应用程序或常规Java使用库类

确定是否从GWT应用程序或常规Java使用库类,java,gwt,compilation,environment,Java,Gwt,Compilation,Environment,我正在编写几个库类,在几个项目之间共享。这些项目中的一些是普通的旧Java,另一些是GWT应用程序。对于其中的一些类,无论它们需要在GWT中运行还是在Java中运行,具体的实现都是不同的(让我们不深入了解确切的原因,但正如许多示例中的一个,Date.getMonth在Java中被弃用,但日历替换在GWT中不可用) 是否有一种方法可以将代码的某些部分标记为与一种或另一种场景相关 我研究了在GWT中使用延迟绑定和类替换,但这需要使用GWT.create()实例化类,而GWT.create()不适用于

我正在编写几个库类,在几个项目之间共享。这些项目中的一些是普通的旧Java,另一些是GWT应用程序。对于其中的一些类,无论它们需要在GWT中运行还是在Java中运行,具体的实现都是不同的(让我们不深入了解确切的原因,但正如许多示例中的一个,Date.getMonth在Java中被弃用,但日历替换在GWT中不可用)

是否有一种方法可以将代码的某些部分标记为与一种或另一种场景相关


我研究了在GWT中使用延迟绑定和类替换,但这需要使用GWT.create()实例化类,而GWT.create()不适用于普通的旧Java应用程序,因此会导致编译错误。

听起来,如果您的代码在GWT环境中运行,您可以使用返回
true
的static(开发或生产)或其他地方的
false
。您必须在服务器类路径中包含
gwt user.jar
。例如,在JVM中运行以下操作:

import com.google.gwt.core.shared.GWT;

public class Main {
    public static void main(String[] args) {
        System.out.println(GWT.isClient() ? "Running client-side." 
                : "Running server-side.");
    }
}

将生成运行服务器端的
在您的控制台中。

找到了一个运行良好的解决方案:我的库的.gwt.xml文件中的
标记

基本上,我的库中有以下EnvironmentFlags类的两个版本。一个在Java使用的实际库中,位于文件夹“lib”:

my.library.EnvironmentFlags如下所示:

package my.library;

public class EnvironmentFlags {
  public static final boolean IS_GWT      = false;
  public static final boolean IS_DEV_MODE = false;
}
package my.library;

import com.google.gwt.core.client.GWT;

public class EnvironmentFlags {
  public static final boolean IS_GWT      = true;
  public static final boolean IS_DEV_MODE = !GWT.isProdMode();
}
<module>
  <source       path='lib'   />
  <super-source path='super' />
</module>
然后是文件夹“super/my/library”中的一个文件,如下所示:

package my.library;

public class EnvironmentFlags {
  public static final boolean IS_GWT      = false;
  public static final boolean IS_DEV_MODE = false;
}
package my.library;

import com.google.gwt.core.client.GWT;

public class EnvironmentFlags {
  public static final boolean IS_GWT      = true;
  public static final boolean IS_DEV_MODE = !GWT.isProdMode();
}
<module>
  <source       path='lib'   />
  <super-source path='super' />
</module>
现在,神奇之处在于:我的库的.gwt.xml文件如下所示:

package my.library;

public class EnvironmentFlags {
  public static final boolean IS_GWT      = false;
  public static final boolean IS_DEV_MODE = false;
}
package my.library;

import com.google.gwt.core.client.GWT;

public class EnvironmentFlags {
  public static final boolean IS_GWT      = true;
  public static final boolean IS_DEV_MODE = !GWT.isProdMode();
}
<module>
  <source       path='lib'   />
  <super-source path='super' />
</module>
Java和GWT编译器都应该从编译结果中删除相应的不可访问/不需要的代码,即不需要运行时开销


PS:IS_DEV_MODE标志实际上与我原来的问题没有任何关系。我只是把它作为免费的东西包括进来,这样我就可以让我的代码以不同的方式运行(例如,更详细)取决于我是在测试还是部署我的GWT应用程序。

您可能可以阅读classpath系统属性来查找此信息。@Vulcan:Hmmm…Java编译器是否足够聪明,能够根据检查周围的复杂if语句删除不需要的代码,或者我是否会失去此功能?代码生成可能是一个问题solution@Jean-米切lGarcia:听起来很复杂;)你有一个如何实现的例子吗?这在非GWT中是不可用的environment@Jean-米歇尔加西亚的反思是必要的。@Jean MichelGarcia看到编辑过的答案,自己试试,收回否决票。类GWT在
共享的
包中是有原因的。@Boris Brudnoy,如果你提到GWT部门,好的。我想他是在试图避免在非GWT代码中使用GWT,我是在试图避免依赖,是的。但这仍然是一个有效的解决方案。我想问的问题是:Java编译器能否根据isClient()函数调用的结果删除代码?(不确定编译时计算的结果)我将用前面提到的
GWT.isClient
替换
GWT.isProdMode
above@Jean-MichelGarcia:isClient()将用于IS_GWT标志,我已经处理了true/false常量和类替换。第二个是_DEV_MODE标志实际上与我的原始问题没有任何关系,我只是将其包括在内,以便根据我是处于GWT DEV模式还是GWT生产模式,让我的代码以不同的方式运行(例如,更详细的错误)。