重新加载单一拷贝XPage设计(SCXD)*Java*应用程序设计

Pau*_*ers 7 xpages

我正在使用Single Copy XPage Design,我的所有业务逻辑都在WebContent\WEB-INF中的文件中写成Java.

如果我需要更改XPage或自定义控件,我可以更新我的模板,刷新设计并立即获取更改.

但是,如果我想对Java代码进行更改,那么所有内容都会被缓存,我发现获取更改的唯一方法是重新启动http任务.

到目前为止,我已经尝试过:

  • 刷新SCXD数据库的设计
  • 替换SCXD数据库的设计
  • 清理SCXD数据库
  • 编辑faces-config(在模板和SCXD数据库中)
  • 删除SCXD数据库中已编译Java代码的.class文件并重新构建
  • 向服务器发出"tell http xsp refresh"命令
  • 用新副本替换SCXD数据库
  • 替换指向SCXD数据库的数据库的设计

除了重新启动http任务之外,似乎没有什么能让Web获取Java代码更改.

有没有我错过的东西?

Bri*_*IBM 2

我们已将此问题记录为SPR# LHEY9X5EBP

我向 XPages 团队发送了这个问题,Maire Kehoe 提供了以下信息和解决方法供尝试。

不是已知问题。看起来像 NSFComponentModule.refresh() 中的一个错误,当有 templateModule 时,它​​永远不会发现文件的任何更改,并且永远不会重置类加载器。

解决方法:单击按钮进行重置。

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:button value="Reset App ClassLoader" id="button1">
    <xp:eventHandler event="onclick" submit="true" refreshMode="complete">
        <xp:this.action><![CDATA[#{javascript:inapp.ResetUtil.reset()}]]></xp:this.action>
    </xp:eventHandler>
</xp:button>
Run Code Online (Sandbox Code Playgroud)

Java代码:

package inapp;
import com.ibm.domino.xsp.module.nsf.ModuleClassLoader;
public class ResetUtil {

    public static void reset(){
        ClassLoader appClassLoader = Thread.currentThread().getContextClassLoader();
        ((ModuleClassLoader)appClassLoader).resetDynamicClassLoader();
        // That code will give:
        // Script interpreter error, line=1, col=17: Error calling method 'reset()' on java class 'inapp.ResetUtil'
        // Access denied (java.lang.RuntimePermission getClassLoader)
        // need to edit C:\Domino\jvm\lib\security\java.policy file to have:
        // grant codeBase "xspnsf://server:0/disc2.nsf/-"{ // nsf name here must be .toLowerCase of actual nsf name.
        // permission java.lang.RuntimePermission "getClassLoader";
        //};
    }
}
Run Code Online (Sandbox Code Playgroud)

允许 Java 代码运行的权限。在 C:\Domino\jvm\lib\security\java.policy 中添加如下行,更新为您的 nsf 名称:

grant codeBase "xspnsf://server:0/disc2.nsf/-"{ // nsf name here must be .toLowerCase of actual nsf name.
    permission java.lang.RuntimePermission "getClassLoader";
};
Run Code Online (Sandbox Code Playgroud)