在Mule ESB中运行编译的Groovy代码时无法调用Java newInstance()而不是Groovy

时间:2013-02-07 22:38:19

标签: groovy mule

在我的Mule ESB 3.3.0应用程序中,在独立模式下运行,我有一个调用Groovy代码的转换器,它包含在maven相关的jar中。在我的groovy代码中,我正在调用一个具有newInstance()静态方法的Java对象,如下所示:

TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", null)

这导致Groovy中的错误,因为我认为它试图调用Groovy增强的Class.newInstance()方法。在Mule独立运行时不会发生这种情况(请参阅下面的更新以了解测试说明)。如何让它调用Java方法而不是Groovy?

这是我的堆栈跟踪的片段。你可以看到它的来电DefaultGroovyMethods.newInstance()。但我想改为调用javax.xml.transform.TransformerFactory.newInstance(String, ClassLoader)方法。怎么样?

groovy.lang.GroovyRuntimeException: Could not find matching constructor for: javax.xml.transform.TransformerFactory(java.lang.String, null)
at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1459)
at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1375)
at org.codehaus.groovy.runtime.InvokerHelper.invokeConstructorOf(InvokerHelper.java:824)
at org.codehaus.groovy.runtime.DefaultGroovyMethods.newInstance(DefaultGroovyMethods.java:18025)

更新: 有关运行时环境的更多信息。 Groovy代码打包为jar文件,并从Mule ESB应用程序调用。 Mule 3.3.0随附groovy-all-1.8.6.jar。

UPDATE2: 我做了一些进一步的测试,并将一个Groovy类编译成一个jar文件,并从一个独立的Java程序调用它,并没有遇到这个问题。这让我相信这是一个从Mule 3.3.0独立环境运行的问题。我在这篇文章中添加了一个骡子标签。希望骡子专家可以告诉我发生了什么。

1 个答案:

答案 0 :(得分:0)

在Groovy用户邮件列表的帮助下,我们确定mule类路径上必须有另一个提供javax.xml.transformer.Transformer类的jar。我添加了这个示例代码:

Class klass = TransformerFactory.class; 
URL location = klass.getResource('/'+klass.getName().replace('.', '/')+".class"); 

果然! Mule正在添加自己的XML API jar。

TranformerFactory JAR: jar:file:/D:/java/mule/mule-standalone-3.3.0/lib/endorsed/xml-apis-1.3.04.jar!/javax/xml/transform/TransformerFactory.class

你为什么要重写JDK骡子?

我的工作是直接实例化Saxon TransformerFactory。它不是很优雅,但我唯一的选择。

tFactory = new net.sf.saxon.TransformerFactoryImpl()