【问题标题】:Issues with MirahMirah的问题
【发布时间】:2016-09-13 03:30:33
【问题描述】:

我主要使用 Codename One 中的 Mirah 库作为 Json 和 Java 类之间的对象映射器。

我遇到了 Mirah 尝试映射未在 .mirah 类中声明的类的问题。例如,我的 .mirah 类有一个 Product 数据映射器

data_mapper 产品:ProductMapper

但错误是抱怨 IUser 接口而不是 Product 类!首先,我不明白为什么 Mirah 会抱怨一个未声明为数据映射器的类。我错过了什么吗?请记住,在我当前的代码中,Product 只有原始数据类型变量,绝对没有对 IUser 接口或 User 实现类的引用。

nbproject\mirah-build-cn1.xml:152: java.lang.RuntimeException:找不到接口 IUser 的存根 在 ca.weblite.asm.JavaExtendedStubCompiler$2.visitClass(JavaExtendedStubCompiler.java:694) 在 com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:720) 在 com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:68) 在 com.sun.source.util.TreeScanner.scan(TreeScanner.java:91) 在 com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:99) 在 com.sun.source.util.TreeScanner.visitCompilationUnit(TreeScanner.java:120) 在 ca.weblite.asm.JavaExtendedStubCompiler$2.visitCompilationUnit(JavaExtendedStubCompiler.java:275) 在 com.sun.tools.javac.tree.JCTree$JCCompilationUnit.accept(JCTree.java:550) 在 com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:68) 在 com.sun.source.util.TreeScanner.scan(TreeScanner.java:91) 在 ca.weblite.asm.JavaExtendedStubCompiler.compile(JavaExtendedStubCompiler.java:797) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileFile(JavaExtendedStubCompiler.java:174) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:211) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:214) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:214) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:214) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:214) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:193) 在 ca.weblite.asm.WLMirahCompiler.compile(WLMirahCompiler.java:208) 在 ca.weblite.mirah.ant.MirahcTask.execute(MirahcTask.java:158) 在 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292) 在 sun.reflect.GeneratedMethodAccessor68.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 在 org.apache.tools.ant.Task.perform(Task.java:348) 在 org.apache.tools.ant.Target.execute(Target.java:435) 在 org.apache.tools.ant.Target.performTasks(Target.java:456) 在 org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393) 在 org.apache.tools.ant.Project.executeTarget(Project.java:1364) 在 org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 在 org.apache.tools.ant.Project.executeTargets(Project.java:1248) 在 org.apache.tools.ant.module.bridge.impl.BridgeImpl.run(BridgeImpl.java:286) 在 org.apache.tools.ant.module.run.TargetExecutor.run(TargetExecutor.java:555) 在 org.netbeans.core.execution.RunClassThread.run(RunClassThread.java:153) 构建失败(总时间:10 秒)

我还想提一下,我高度怀疑清理项目可能不会清理所有 Mirah 生成的类。由于上述错误,我根本无法构建我的应用程序,我尝试从我的项目中删除“.mirah”类,然后尝试清理和重建,但从那时起我仍然收到相同的错误。

我能够让项目再次编译的唯一方法是启动一个全新的项目并将我的源文件移到那里,将 .mirah 类排除在外。

感谢任何见解!

更多详情以下更新

嗨,史蒂夫。非常感谢您的反馈!我花了一些时间试图找出问题所在。我认为这个问题与泛型有关。据我所知,泛型类型在编译时被替换,所以我猜 Codename One 会支持泛型就好了。在尝试走 Mirah 路线之前,我的代码也编译得很好。我真的认为米拉是一个绝妙的主意。

这里有几个步骤可以重现问题。我开始了一个 CN1 Hello world 项目并创建了以下类

1)爱之家

import java.util.List;

public interface IHouse<W extends IWindow> {

public int getHouseColor();

public void setHouseColor(int color);

public List<W> getWindows(); 

public void setWindows(List<W> windows);

}

2)IWindow

public interface IWindow {

public int getWindowColor();

public void setWindowColor(int newColor);

public String getShape();
}

3) 圆窗

public class RoundWindow implements IWindow {

private int windowColor;
private String shape;

public RoundWindow() {
    String shape = "ROUND";
}

@Override
public int getWindowColor() {
    return windowColor;
}

@Override
public void setWindowColor(int newColor) {
    windowColor = newColor;
}

@Override
public String getShape() {
    return shape;
}

}

4) 方形窗口

public class SquareWindow implements IWindow {

private int windowColor;
private String shape;

public SquareWindow() {
    String shape = "SQUARE";
}

@Override
public int getWindowColor() {
    return windowColor;
}

@Override
public void setWindowColor(int newColor) {
    windowColor = newColor;
}

@Override
public String getShape() {
    return shape;
}
}

5) 房子

public class House implements IHouse<RoundWindow> {

private int houseColor;

List<RoundWindow> windows;

@Override
public int getHouseColor() {
    return houseColor;
}

@Override
public void setHouseColor(int color) {
    houseColor = color;
}

@Override
public List<RoundWindow> getWindows() {
    return windows;
}

@Override
public void setWindows(List<RoundWindow> windows) {
    this.windows = windows;
}

}

回顾一下,我有一个 IHouse 接口,它支持实现 IWindow 的任何类型的窗口。然后实现 IHouse 接口的 House 类可以严格指定它支持/使用的 Window。

在添加 Mirah 插件之前,此代码在 CN1 中编译良好。虽然我收到与我之前添加 Mirah 时解释的相同的错误。

执行此行时发生以下错误: C:\Users\location\NetBeansProjects\Test\nbproject\mirah-build.xml:51: java.lang.RuntimeException:找不到接口 IHouse 的存根 在 ca.weblite.asm.JavaExtendedStubCompiler$2.visitClass(JavaExtendedStubCompiler.java:694) 在 com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:720) 在 com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:68) 在 com.sun.source.util.TreeScanner.scan(TreeScanner.java:91) 在 com.sun.source.util.TreeScanner.scanAndReduce(TreeScanner.java:99) 在 com.sun.source.util.TreeScanner.visitCompilationUnit(TreeScanner.java:120) 在 ca.weblite.asm.JavaExtendedStubCompiler$2.visitCompilationUnit(JavaExtendedStubCompiler.java:275) 在 com.sun.tools.javac.tree.JCTree$JCCompilationUnit.accept(JCTree.java:550) 在 com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:68) 在 com.sun.source.util.TreeScanner.scan(TreeScanner.java:91) 在 ca.weblite.asm.JavaExtendedStubCompiler.compile(JavaExtendedStubCompiler.java:797) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileFile(JavaExtendedStubCompiler.java:174) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:211) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:214) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:214) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:214) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:214) 在 ca.weblite.asm.JavaExtendedStubCompiler.compileDirectory(JavaExtendedStubCompiler.java:193) 在 ca.weblite.asm.WLMirahCompiler.compile(WLMirahCompiler.java:208) 在 ca.weblite.mirah.ant.MirahcTask.execute(MirahcTask.java:158) 在 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292) 在 sun.reflect.GeneratedMethodAccessor323.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 在 org.apache.tools.ant.Task.perform(Task.java:348) 在 org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) 在 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292) 在 sun.reflect.GeneratedMethodAccessor323.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 在 org.apache.tools.ant.Task.perform(Task.java:348) 在 org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:396) 在 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292) 在 sun.reflect.GeneratedMethodAccessor323.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 在 org.apache.tools.ant.Task.perform(Task.java:348) 在 org.apache.tools.ant.Target.execute(Target.java:435) 在 org.apache.tools.ant.Target.performTasks(Target.java:456) 在 org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393) 在 org.apache.tools.ant.Project.executeTarget(Project.java:1364) 在 org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 在 org.apache.tools.ant.Project.executeTargets(Project.java:1248) 在 org.apache.tools.ant.module.bridge.impl.BridgeImpl.run(BridgeImpl.java:286) 在 org.apache.tools.ant.module.run.TargetExecutor.run(TargetExecutor.java:555) 在 org.netbeans.core.execution.RunClassThread.run(RunClassThread.java:153) 构建失败(总时间:9 秒)

Few Observation,如果我删除 House 类,代码构建良好(最后显示“构建成功”)但我看到以下警告。我相信这是由于试图预编译一个通用接口,我们还不知道 w 的确切类型(直到运行时)。这可能是问题的根本原因。

Failed to get signature for method 
public List<W> getWindows();
Failed to get signature for method 
public void setWindows(List<W> windows);

最后,更改我的模型设计并完全摆脱泛型可以让我的代码再次编译,而没有任何 Mirah 投诉。在我的实际项目中,出于多种原因,我想保留我当前的设计(使用泛型)。

是否可以同时使用 Mirah Json 到 Java 的转换工具以及泛型?

提前感谢您的宝贵时间!

【问题讨论】:

  • 泛型应该可以工作。如果你能把它窒息的课程发给我(public List&lt;W&gt; getWindows() 的课程,我会把它添加到我的测试套件中并尝试找出问题所在)。
  • 是的,对不起!我两次发布了 House 课程。我的意思是真正提出 IHouse,然后是实施 House 类。我在 IHouse 界面上方更新了#1)
  • 其实,那些警告应该还是没问题的。问题是 IUser 界面。任何导致它失败的原因都集中在 IUser 界面上。相关类将是实现 IUser 或在其公共方法或字段签名(即参数和返回类型)中引用它的类。
  • 那么您是否看到项目中的 5 个类由于此错误而导致构建失败? “在 ca.weblite.asm.JavaExtendedStubCompiler$2.visitClass(JavaExtendedStubCompiler.java:694) 找不到接口 IUser 的存根”,由于这个问题,它基本上停止了构建。
  • 不,我没有看到这个问题。

标签: codenameone


【解决方案1】:

Mirah netbeans 插件允许项目中的双向 mirah-java 依赖项。为此,它首先编译项目中 Java 源的“存根”,以便在 mirah 编译步骤期间可以从 Mirah 引用它们。在 mirah 完成编译为 .classes 后,它会执行“真正的”java 编译步骤,该步骤引用已编译的 mirah 文件。这就是它引用 IUser 类的原因。这是令人窒息的“预编译”步骤。

该错误表示在预编译 java 存根时找不到 IUser 类。我必须查看该项目才能知道原因。

【讨论】:

  • 我用更多细节更新了原始问题!很抱歉这篇冗长的帖子。如果您需要整个项目,请告诉我。我可以将其压缩并发送。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 2020-02-29
相关资源
最近更新 更多