JsInterop "com is not defined"
JsInterop "com is not defined"
尝试使用 JsInterop 与每个 Javascript 的 LibGDX 项目通信。我遵循 "Exporting a Java type to JavaScript" 示例 here。它不起作用:Uncaught ReferenceError 'com' 未定义。不过 gradle
我没有收到任何错误。
我已经:
- 已检查是否已启用 generateJsInteropExports:
My GdxDefinition.gwt.xml
:
<module rename-to="html">
<inherits name='com.badlogic.gdx.backends.gdx_backends_gwt' />
<inherits name='com.badlogic.gdx.physics.box2d.box2d-gwt' />
<inherits name='myapp' />
<entry-point class='com.mypackage.myapp.client.HtmlLauncher' />
<set-configuration-property name="gdx.assetpath" value="../android/assets" />
<set-configuration-property name='xsiframe.failIfScriptTag' value='FALSE'/>
<set-configuration-property name='generateJsInteropExports' value='true'/>
<set-property name="user.agent" value="safari"/>
</module>
我在想,也许入口点HtmlLauncher
也应该是一个@JsType
,但这也没有用。
还检查了在 GdxDefinitionSuperdev.gwt.xml
中是否启用了 generateJsInteropExports
以不同的方式在浏览器控制台中访问 class,例如:
.
new com.mypackage.myapp.client.Test();
new Test(); // when setting namespace to global
$wnd.Test(); // JSNI syntax
我是这样编译的:
gradlew.bat html:dist --daemon -generateJsInteropExports=true
我的class(就在html模块中,也在核心模块中试过了,还是不行)看起来是这样的:
package com.mypackage.myapp.client;
import jsinterop.annotations.JsPackage;
import jsinterop.annotations.JsType;
@JsType(namespace = JsPackage.GLOBAL)
public class Test {
public String name;
public Test(String name) {
this.name = name;
}
public void sayHello() {
return "Hello" + this.name;
}
}
我 运行 没主意了。谁能帮我弄清楚该怎么做才能让它发挥作用。
一些可能有用的信息:
我的代码 html.gradle
:
gwt {
gwtVersion='2.8.0' // Should match the gwt version used for building the gwt backend
//...
modules 'com.mypackage.myapp.GdxDefinition'
devModules 'com.mypackage.myapp.GdxDefinitionSuperdev'
project.webAppDirName = 'webapp'
compiler {
strict = true;
disableCastChecking = true;
}
}
import org.wisepersist.gradle.plugins.gwt.GwtSuperDev
//...
task superDev (type: GwtSuperDev) {
dependsOn startHttpServer
doFirst {
gwt.modules = gwt.devModules
}
}
//...
我的代码 project gradle
buildscript {
//...
dependencies {
classpath 'org.wisepersist:gwt-gradle-plugin:1.0.6'
//...
}
}
project(":html") {
apply plugin: "gwt"
apply plugin: "war"
dependencies {
compile project(":core")
compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion"
compile "com.badlogicgames.gdx:gdx:$gdxVersion:sources"
compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion:sources"
compile "com.badlogicgames.gdx:gdx-box2d:$gdxVersion:sources"
compile "com.badlogicgames.gdx:gdx-box2d-gwt:$gdxVersion:sources"
compile "com.google.jsinterop:jsinterop-annotations:1.0.1"
}
}
project(":core") {
apply plugin: "java"
dependencies {
//...
compile "com.google.jsinterop:jsinterop-annotations:1.0.1"
}
}
//...
更新 1
我查看了 Colin Alworth 的回答和他发布的链接。它仍然不起作用。我改变了:
html.gradle
gwt {
gwtVersion='2.8.0' // Should match the gwt version used for building the gwt backend
maxHeapSize="1G" // Default 256m is not enough for gwt compiler. GWT is HUNGRY
minHeapSize="1G"
src = files(file("src/")) // Needs to be in front of "modules" below.
modules 'com.mycompany.myapp.GdxDefinition'
devModules 'com.mycompany.myapp.GdxDefinitionSuperdev'
project.webAppDirName = 'webapp'
compiler {
strict = true;
disableCastChecking = true;
}
jsInteropExports {
shouldGenerate = true
includePatterns = ['com.mycompany.myapp.client.*']
}
}
就像它说的 here。
我这样调用:gradlew.bat html:dist --daemon
我从 GdxDefinition 文件中删除了 属性 generateJsInteropExports
,因为它看起来是错误的。
现在我得到以下编译错误:
Task :html:compileGwt FAILED
Unknown argument: -includeJsInteropExports
这是为什么?
<set-configuration-property name='generateJsInteropExports' value='true'/>
这绝对不会产生那些出口
gradlew.bat html:dist --daemon -generateJsInteropExports=true
我不知道 gradle 有多糟糕,但我几乎可以肯定这也是错误的(至少它需要一个 -P
前缀,但我没有看到 属性 正在您共享的 gradle 文件中使用。
相反,您需要将它传递给您的 gradle 插件,用于超级开发模式和生产编译任务。
快速浏览 org.wisepersist:gwt-gradle-plugin
的文档,该任务似乎需要一个 GwtJsInteropExportsOptions arg(从 http://gwt-gradle-plugin.documentnode.io/javadoc/org/wisepersist/gradle/plugins/gwt/GwtJsInteropExportsOptions.html and http://gwt-gradle-plugin.documentnode.io/javadoc/org/wisepersist/gradle/plugins/gwt/AbstractGwtActionTask.html#setJsInteropExports-org.wisepersist.gradle.plugins.gwt.GwtJsInteropExportsOptions- 开始工作),根据我有限的 gradle 经验最终像
jsInteropExports {
generate = true
}
看起来这可以放在 gwt {}
块中,与 compiler {}
.
一起
这是一个关于该插件跟踪器的问题,讨论了如何做到这一点 https://github.com/jiakuan/gwt-gradle-plugin/issues/19。
非常感谢@Colin Alworth,我找到了如何让它工作。
html.gradle
gwt {
gwtVersion='2.8.0' // Should match the gwt version used for building the gwt backend
maxHeapSize="1G" // Default 256m is not enough for gwt compiler. GWT is HUNGRY
minHeapSize="1G"
src = files(file("src/")) // Needs to be in front of "modules" below.
modules 'com.mycompany.myapp.GdxDefinition'
devModules 'com.mycompany.myapp.GdxDefinitionSuperdev'
project.webAppDirName = 'webapp'
compiler {
strict = true;
disableCastChecking = true;
}
// important part:
jsInteropExports {
shouldGenerate = true
// breaks if I use includePatterns
}
}
还有
- 从 Gdx 定义文件中删除
<set-configuration-property name='generateJsInteropExports' value='true'/>
- 在导出的全局命名空间中不使用相同的名称类(愚蠢的错误,我知道)
- 像
gradlew.bat html:dist --daemon
那样编译调用
完美的结果:
尝试使用 JsInterop 与每个 Javascript 的 LibGDX 项目通信。我遵循 "Exporting a Java type to JavaScript" 示例 here。它不起作用:Uncaught ReferenceError 'com' 未定义。不过 gradle
我没有收到任何错误。
我已经:
- 已检查是否已启用 generateJsInteropExports:
My GdxDefinition.gwt.xml
:
<module rename-to="html">
<inherits name='com.badlogic.gdx.backends.gdx_backends_gwt' />
<inherits name='com.badlogic.gdx.physics.box2d.box2d-gwt' />
<inherits name='myapp' />
<entry-point class='com.mypackage.myapp.client.HtmlLauncher' />
<set-configuration-property name="gdx.assetpath" value="../android/assets" />
<set-configuration-property name='xsiframe.failIfScriptTag' value='FALSE'/>
<set-configuration-property name='generateJsInteropExports' value='true'/>
<set-property name="user.agent" value="safari"/>
</module>
我在想,也许入口点HtmlLauncher
也应该是一个@JsType
,但这也没有用。
还检查了在
GdxDefinitionSuperdev.gwt.xml
中是否启用了 generateJsInteropExports
以不同的方式在浏览器控制台中访问 class,例如:
.
new com.mypackage.myapp.client.Test();
new Test(); // when setting namespace to global
$wnd.Test(); // JSNI syntax
我是这样编译的:
gradlew.bat html:dist --daemon -generateJsInteropExports=true
我的class(就在html模块中,也在核心模块中试过了,还是不行)看起来是这样的:
package com.mypackage.myapp.client;
import jsinterop.annotations.JsPackage;
import jsinterop.annotations.JsType;
@JsType(namespace = JsPackage.GLOBAL)
public class Test {
public String name;
public Test(String name) {
this.name = name;
}
public void sayHello() {
return "Hello" + this.name;
}
}
我 运行 没主意了。谁能帮我弄清楚该怎么做才能让它发挥作用。
一些可能有用的信息:
我的代码 html.gradle
:
gwt {
gwtVersion='2.8.0' // Should match the gwt version used for building the gwt backend
//...
modules 'com.mypackage.myapp.GdxDefinition'
devModules 'com.mypackage.myapp.GdxDefinitionSuperdev'
project.webAppDirName = 'webapp'
compiler {
strict = true;
disableCastChecking = true;
}
}
import org.wisepersist.gradle.plugins.gwt.GwtSuperDev
//...
task superDev (type: GwtSuperDev) {
dependsOn startHttpServer
doFirst {
gwt.modules = gwt.devModules
}
}
//...
我的代码 project gradle
buildscript {
//...
dependencies {
classpath 'org.wisepersist:gwt-gradle-plugin:1.0.6'
//...
}
}
project(":html") {
apply plugin: "gwt"
apply plugin: "war"
dependencies {
compile project(":core")
compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion"
compile "com.badlogicgames.gdx:gdx:$gdxVersion:sources"
compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion:sources"
compile "com.badlogicgames.gdx:gdx-box2d:$gdxVersion:sources"
compile "com.badlogicgames.gdx:gdx-box2d-gwt:$gdxVersion:sources"
compile "com.google.jsinterop:jsinterop-annotations:1.0.1"
}
}
project(":core") {
apply plugin: "java"
dependencies {
//...
compile "com.google.jsinterop:jsinterop-annotations:1.0.1"
}
}
//...
更新 1
我查看了 Colin Alworth 的回答和他发布的链接。它仍然不起作用。我改变了:
html.gradle
gwt {
gwtVersion='2.8.0' // Should match the gwt version used for building the gwt backend
maxHeapSize="1G" // Default 256m is not enough for gwt compiler. GWT is HUNGRY
minHeapSize="1G"
src = files(file("src/")) // Needs to be in front of "modules" below.
modules 'com.mycompany.myapp.GdxDefinition'
devModules 'com.mycompany.myapp.GdxDefinitionSuperdev'
project.webAppDirName = 'webapp'
compiler {
strict = true;
disableCastChecking = true;
}
jsInteropExports {
shouldGenerate = true
includePatterns = ['com.mycompany.myapp.client.*']
}
}
就像它说的 here。
我这样调用:gradlew.bat html:dist --daemon
我从 GdxDefinition 文件中删除了 属性 generateJsInteropExports
,因为它看起来是错误的。
现在我得到以下编译错误:
Task :html:compileGwt FAILED
Unknown argument: -includeJsInteropExports
这是为什么?
<set-configuration-property name='generateJsInteropExports' value='true'/>
这绝对不会产生那些出口
gradlew.bat html:dist --daemon -generateJsInteropExports=true
我不知道 gradle 有多糟糕,但我几乎可以肯定这也是错误的(至少它需要一个 -P
前缀,但我没有看到 属性 正在您共享的 gradle 文件中使用。
相反,您需要将它传递给您的 gradle 插件,用于超级开发模式和生产编译任务。
快速浏览 org.wisepersist:gwt-gradle-plugin
的文档,该任务似乎需要一个 GwtJsInteropExportsOptions arg(从 http://gwt-gradle-plugin.documentnode.io/javadoc/org/wisepersist/gradle/plugins/gwt/GwtJsInteropExportsOptions.html and http://gwt-gradle-plugin.documentnode.io/javadoc/org/wisepersist/gradle/plugins/gwt/AbstractGwtActionTask.html#setJsInteropExports-org.wisepersist.gradle.plugins.gwt.GwtJsInteropExportsOptions- 开始工作),根据我有限的 gradle 经验最终像
jsInteropExports {
generate = true
}
看起来这可以放在 gwt {}
块中,与 compiler {}
.
这是一个关于该插件跟踪器的问题,讨论了如何做到这一点 https://github.com/jiakuan/gwt-gradle-plugin/issues/19。
非常感谢@Colin Alworth,我找到了如何让它工作。
html.gradle
gwt {
gwtVersion='2.8.0' // Should match the gwt version used for building the gwt backend
maxHeapSize="1G" // Default 256m is not enough for gwt compiler. GWT is HUNGRY
minHeapSize="1G"
src = files(file("src/")) // Needs to be in front of "modules" below.
modules 'com.mycompany.myapp.GdxDefinition'
devModules 'com.mycompany.myapp.GdxDefinitionSuperdev'
project.webAppDirName = 'webapp'
compiler {
strict = true;
disableCastChecking = true;
}
// important part:
jsInteropExports {
shouldGenerate = true
// breaks if I use includePatterns
}
}
还有
- 从 Gdx 定义文件中删除
<set-configuration-property name='generateJsInteropExports' value='true'/>
- 在导出的全局命名空间中不使用相同的名称类(愚蠢的错误,我知道)
- 像
gradlew.bat html:dist --daemon
那样编译调用
完美的结果: