JsInterop "com не определен"
Попытка связаться с проектом LibGDX по Javascript с помощью JsInterop. Я следую примеру "Экспорт типа Java в JavaScript" здесь. Это не работает: 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
, но это тоже не сработало.
Также проверил, что generateJsInteropExports включен в
GdxDefinitionSuperdev.gwt.xml
Доступ к классу в консоли браузера различными способами, такими как:
,
new com.mypackage.myapp.client.Test();
new Test(); // when setting namespace to global
$wnd.Test(); // JSNI syntax
Я собираю так:
gradlew.bat html:dist --daemon -generateJsInteropExports=true
Мой класс (прямо в модуле html, также пробовал в модуле core, все еще не работает) выглядит так:
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
Я проверил ответ Колина Алворта и ссылки, которые он разместил. Это все еще не работает. Я изменился:
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.*']
}
}
Как это сказано здесь.
Я звоню как: gradlew.bat html:dist --daemon
и я снял собственность generateJsInteropExports
из файлов GdxDefinition, поскольку это кажется неправильным.
Теперь я получаю следующую ошибку компиляции:
Task :html:compileGwt FAILED
Unknown argument: -includeJsInteropExports
Это почему?
2 ответа
Большое спасибо @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
}
}
А также
- Удалить
<set-configuration-property name='generateJsInteropExports' value='true'/>
из файлов определений Gdx - Не использовать одно и то же имя в глобальном пространстве имен для экспортируемых классов (глупая ошибка, я знаю)
- Компилировать вызов как
gradlew.bat html:dist --daemon
И идеальный результат:
<set-configuration-property name='generateJsInteropExports' value='true'/>
Это определенно не будет работать, чтобы генерировать этот экспорт
gradlew.bat html:dist --daemon -generateJsInteropExports=true
Я не очень хорошо знаю Gradle, но я почти уверен, что это тоже неправильно (по крайней мере, это нужно -P
префикс, но я не вижу, чтобы это свойство использовалось в файле Gradle, которым вы поделились).
Вместо этого вам нужно передать его в плагин Gradle, как для режима Super Dev, так и для задачи производственной компиляции.
С первого взгляда на документы для org.wisepersist:gwt-gradle-plugin
Похоже, что задача получит аргумент GwtJsInteropExportsOptions (работает с http://gwt-gradle-plugin.documentnode.io/javadoc/org/wisepersist/gradle/plugins/gwt/GwtJsInteropExportsOptions.html и http://gwt-gradle-plugin.documentnode.io/javadoc/org/wisepersist/gradle/plugins/gwt/AbstractGwtActionTask.html. лайк
jsInteropExports {
generate = true
}
Похоже, это может пойти в gwt {}
блок, рядом compiler {}
,
Вот проблема на трекере этого плагина, которая обсуждает, как это сделать, https://github.com/jiakuan/gwt-gradle-plugin/issues/19.