2

所以这是我试图运行的非常简化的 Lotus Domino Java 代理代码......

import lotus.domino.*;

enum SingletonTest { 
    INSTANCE;

    public void helloWorld() {
        System.out.println("Hello World");
    }
}

public class JavaAgent extends AgentBase {

    public void NotesMain() {

        try {
            System.out.println("Started");
            SingletonTest.INSTANCE.helloWorld();
            System.out.println("Done");

        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

但是当我尝试运行它时,这就是 Java 控制台上出现的内容......

Started
Exception in thread "AgentThread: JavaAgent" java.lang.VerifyError: JVMCFRE028 ldc* bytecode must reference a constant; class=, method=valueOf(Ljava/lang/String;)LSingletonTest;, pc=0
    at java.lang.ClassLoader.defineClassImpl(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:275)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:212)
    at lotus.domino.AgentLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:626)
    at JavaAgent.NotesMain(JavaAgent.java:17)
    at lotus.domino.AgentBase.runNotes(Unknown Source)
    at lotus.domino.NotesThread.run(Unknown Source)

我正在为我的代理使用 Java 1.6。我正在使用 v8.5.3 FP3,在我的 notes.ini 中我有..

JavaCompilerTarget=CurrentJavaVersion

那么我做错了什么?

使用包含代码的枚举的 IBM Java 版本类加载器是否存在问题?

这是我试图遵循的单例编码模式......

https://stackoverflow.com/a/71399/2530065

编辑:我可能应该添加我作为带有“触发器:事件:操作菜单选择”和“目标:无”的 Notes 客户端代理运行它。

编辑2:所以我已经使用相同的 IBM JRE/JVM 在独立的 Java 程序中测试了这个确切的代码,并且代码可以完美运行,没有任何问题。我似乎无法让它在 Notes 客户端中作为 Java 代理工作。

4

2 回答 2

1
  1. 打开 Designer 首选项并选择编译器设置。

    喜好

  2. 单击“配置项目特定设置...”

  3. 选择您的项目并单击确定。

    选择项目

  4. 将设置更改为 1.6 和默认合规性设置。

    合规性设置

  5. 单击确定。你应该得到一些提示,选择默认值。然后再次打开并保存您的代理以重新编译它。

使用您的代码,我做到了这一点并没有错误地运行它。

于 2013-07-02T08:27:12.490 回答
1

最后我发现从...更改 NOTES.INI 设置JavaCompilerTarget

JavaCompilerTarget=CurrentJavaVersion

...至...

JavaCompilerTarget=1.6

并从头开始重新创建代理解决了这个问题。

对于 Java 代理,代理文档中似乎有两个字段用于控制源 Java 版本和目标 Java 版本。

它们是 $JavaCompilerSource 和 $JavaCompilerTarget。

它们是在创建 Java 代理时设置的。这些字段的值取决于创建代理时 NOTES.INI JavaCompilerTarget 条目的值。创建代理后更改 NOTES.INI 条目并编辑或重新编译代理无效。

如果在 NOTES.INI 变量“JavaCompilerTarget”设置为“CurrentJavaVersion”时创建 Java 代理,则字段“$JavaCompilerTarget”设置为值“CurrentJ”,字段“$JavaCompilerSource”设置为值“1.6 ”。

如果在 NOTES.INI 变量“JavaCompilerTarget”设置为“1.6”时创建 Java 代理,则字段“$JavaCompilerTarget”设置为值“1.6”,字段“$JavaCompilerSource”设置为值“1.6” ”。

如果这个特定代理的“$JavaCompilerTarget”字段的值为“CurrentJ”,那么我会得到异常。

而如果我重新创建相同的代理并且其“$JavaCompilerTarget”字段的值为“1.6”,我不会得到异常。

如果我在 NOTES.INI 变量设置为“1.5”时重新创建此代理,则代理字段值都设置为“1.5”并且代理运行时不会出现任何错误。

如果我使用 ytria scanEZ 更改损坏的代理(具有 $JavaCompilerTarget="CurrentJ" 字段的代理),使值改为“1.6”,然后我在设计器中打开并重新保存代理,它不再抛出异常。如果我将字段值更改回“CurrentJ”并重新保存代理,它会再次引发异常。

因此,Java 代理字段 $JavaCompilerTarget="CurrentJ" 似乎不好,当您有 JavaCompilerTarget=CurrentJavaVersion 的 NOTES.INI 条目时会发生这种情况。

我不知道为什么这会改变 JVM 行为,但它在 8.5.3 FP3 上对我有用。

于 2013-07-03T05:07:15.420 回答