【问题标题】:How to call a java shared script library from a Java agent in Xpages?如何从 Xpages 中的 Java 代理调用 Java 共享脚本库?
【发布时间】:2014-01-29 08:54:25
【问题描述】:

我有一个设置为每天 8:00 运行的代理
我想编写一个 java 代码(在一个共享库中)并使用参数从代理调用该库。

例如:

代理代码:

    // ....
    checkAndSendMail(email_1);
    checkAndSendMail(email_2);
    // ....

java库代码:

public class Check{       
    public void checkAndSendMail(String email_param){
        // ...
        mail.send(email_param);
        // ...
    }    
}
  • 我可以从 Xpages 中的 Java 代理调用 Java 共享脚本库吗?
  • 如果是,那怎么打电话?

【问题讨论】:

标签: java xpages lotus-notes lotus-domino


【解决方案1】:

XPages 和 Domino Java 代理中的 JVM 是分开的,因此您不能在它们之间共享 Java 代码。 如果您转到设计器中的脚本库部分,您可以创建 java 代码

不是用于 XPages 的 Java/Jar 部分。并创建一个可以包含在 Java 代理中的新 Java 库。

【讨论】:

    【解决方案2】:

    您可以这样做,但这只有在大量“开销”的情况下才有可能。假设您想在代理中加载 Java 类,您可以执行以下操作:

    1. 获取包含您的类的设计说明(例如,具有特殊设计视图或 Java NAPI)
    2. 使用 DXL 导出笔记
    3. 提取所有“$ClassData”字段的内容
    4. Base64 解码内容
    5. 跳过前 42 个字节,并使用您自己的类加载器加载生成的字节数组(覆盖执行 defineClass 调用的 findClass 方法)
    6. 现在您可以在代理中实例化该类并通过反射访问它

    如您所见,这是可能的,但需要付出比仅仅“加倍” DDE 中的库更大的努力。

    编辑:

    这是一个代理类加载器的示例。 Base64 编码的 DXL 已添加。 代理实例化类ch.hasselba.demo.LoadedClass并调用方法printTime()

    package ch.hasselba.demo;
    
    public class LoadedClass {
    
        public void printTime(){
            System.out.println("Time: " + System.currentTimeMillis() );
        }
    }
    

    代理的代码(使用lwpd.commons.jar

    import lotus.domino.AgentBase;
    import com.ibm.commons.util.io.base64.Base64;
    import java.lang.reflect.Method;
    
    public class JavaAgent extends AgentBase {
    
        public void NotesMain() {
    
            try {
                // trucated DXL string
                String dataDXL = "YQAYAAAAAACqAgAAAQAAAAAAAAAAAAAAYAC8AgAAqgKqAgAAAAAAAAAAyv66vgAAADEALwcAAgEAFWNoL2hhc3NlbGJhL3hwYWdlcy9aWgcA";
    
                // base64 decode the string
                String b64 = Base64.decode(dataDXL);
                byte[] b64Bytes = b64.getBytes();
                byte[] classBytes = new byte[b64Bytes.length - 42];
    
                // skip the first 42 bytes
                System.arraycopy( b64Bytes, 42, classBytes, 0, b64Bytes.length - 42);
    
                try {
                    // load the class
                    ByteClassLoader obj = new ByteClassLoader();
                    Class theClass = obj.findClass("ch.hasselba.demo.LoadedClass", classBytes);
                    // instantiate it
                    Object theInstance = theClass.newInstance();
    
                    // get the method printTime via Reflection & call it
                    Method theMethod = theInstance.getClass().getMethod("printTime", null);
                    theMethod.invoke( theInstance, null);
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
            } catch (Exception e) {
                e.printStackTrace();
    
            }
        }
    
        // the class loader
        public static class ByteClassLoader extends ClassLoader {
    
            public Class findClass(String name, byte[] data) {
                return defineClass(name, data, 0, data.length);
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      迈克,弗雷德里克是对的 - 不分享。除非... 您将共享代码打包到一个 Jar 中,然后将该代码部署到服务器和/或客户端的 jvm/lib/ext 目录中。您的管理员可能不会喜欢这样。 OpenNTF 上有一个 updatesite.ntf 的补丁版本,允许将插件部署到服务器操作系统中。您可以破解脚本以将 jar 部署到 ext 目录中。但请在征得管理员同意的情况下使用。

      :-) stw

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多