在Java应用程序中嵌入Groovy:

cedebl8k  于 5个月前  发布在  Java
关注(0)|答案(1)|浏览(59)

我有一个应用程序(使用Java 8),它以嵌入式方式使用Groovy脚本,如下所示:

GroovyClassLoader gcl = new GroovyClassLoader();
            Class calcClass = gcl.parseClass(myclass);
            GroovyObject calc = (GroovyObject) calcClass.newInstance();
            return (String) calc.invokeMethod("evaluateScript", new Object[]{});

字符串
一直都很有效。
我最近升级到了Java 17,同样的逻辑生成了下面的异常:

Unable to evaluate smart template script: java.lang.reflect.InaccessibleObjectException: Unable to make java.text.AttributedCharacterIterator java.text.Format.createAttributedCharacterIterator(java.text.AttributedCharacterIterator[]) accessible: module java.base does not "opens java.text" to unnamed module @4ec24700


我正在从java.text中使用SimpleDateFormat,脚本似乎不允许访问这个包中的类。
有什么方法可以让它工作吗?Groovy文档(https://docs.groovy-lang.org/latest/html/documentation/guide-integrating.html)没有提到任何关于Java模块或类似的东西。
谢谢你,谢谢
更新:添加在脚本中调用的代码:

String FRIST(String fromDate, String addDays, String format) {
        if(fromDate==null || "".equals(fromDate))
            return "??.??.????";
        
        java.text.SimpleDateFormat df=new java.text.SimpleDateFormat("dd.MM.yyyy");
        try {
            java.util.Date testDate = df.parse(fromDate)
            java.util.Calendar cal = java.util.Calendar.getInstance(); 
            cal.setTime(testDate);
            if(cal.get(Calendar.YEAR) < 2000)
                cal.add(java.util.Calendar.YEAR, 2000);
            cal.add(java.util.Calendar.DAY_OF_MONTH, Integer.parseInt(addDays));
            testDate = cal.getTime();
            if(format==null) {
                return df.format(testDate);
            } else {
                return new java.text.SimpleDateFormat(format).format(testDate);
            }
        } catch (Throwable t) {
            return "??.??.????"
        }
        
    }

eagi6jfj

eagi6jfj1#

这个问题可以通过升级到最新的Groovy稳定版本(在撰写本文时是4.0.16)来解决。
感谢上面的评论者,特别是@david-conrad对升级Groovy的具体建议。

相关问题