所以这是我试图运行的非常简化的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客户端代理运行它“Trigger:On event:Action Menu selection”和“Target:None”。
EDIT2: 所以我使用相同的IBM JRE / JVM在独立的Java程序中测试了这个确切的代码,代码完美无缺。我似乎无法让它在Notes客户端中作为Java代理工作。
答案 0 :(得分:1)
打开Designer偏好设置并选择编译器设置。
点击"配置项目特定设置..."
选择项目,然后单击“确定”。
将设置更改为1.6和默认合规性设置。
单击“确定”。您应该收到一些提示,选择默认值。然后再次打开并保存代理以重新编译它。
使用你的代码我做了这个并运行它没有错误。
答案 1 :(得分:1)
最后我发现从...
更改了NOTES.INI设置JavaCompilerTargetJavaCompilerTarget = 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上为我做了。