Java项目到Groovy - 库不起作用

时间:2017-08-31 09:22:31

标签: java groovy jar

我在java中编写了一个程序,现在我想用groovy运行它。我这样做是为了练习,所以不要质疑我为什么一开始就没有在groovy编程。 ;)

我在java中使用了很多库,因此我将它们复制到%GROOVY_HOME%\lib目录中。执行此操作后,我无法再运行groovyConsole.exe,因此运行groovyConsole.bat(使用cmd)以获取错误,该错误如下:

C:\Program Files (x86)\Groovy\Groovy-2.4.11\bin>groovyConsole.bat
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:109)
        at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:131)
Caused by: javax.xml.parsers.FactoryConfigurationError: java.lang.ClassNotFoundException: org.apache.crimson.jaxp.SAXParserFactoryImpl
        at javax.xml.parsers.SAXParserFactory.newInstance(SAXParserFactory.java:116)
        at org.apache.ivy.core.settings.XmlSettingsParser.doParse(XmlSettingsParser.java:160)
        at org.apache.ivy.core.settings.XmlSettingsParser.parse(XmlSettingsParser.java:150)
        at org.apache.ivy.core.settings.IvySettings.load(IvySettings.java:417)
        at org.apache.ivy.core.settings.IvySettings$load.call(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
        at groovy.grape.GrapeIvy.<init>(GrapeIvy.groovy:97)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
        at java.lang.reflect.Constructor.newInstance(Unknown Source)
        at java.lang.Class.newInstance(Unknown Source)
        at groovy.grape.Grape.getInstance(Grape.java:121)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
        at groovy.lang.MetaClassImpl.getProperty(MetaClassImpl.java:1850)
        at groovy.lang.MetaClassImpl.getProperty(MetaClassImpl.java:3758)
        at org.codehaus.groovy.runtime.callsite.ClassMetaClassGetPropertySite.getProperty(ClassMetaClassGetPropertySite.java:51)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:296)
        at groovy.ui.ConsoleIvyPlugin.addListener(ConsoleIvyPlugin.groovy:44)
        at groovy.ui.ConsoleIvyPlugin$addListener.call(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
        at groovy.ui.Console.<init>(Console.groovy:242)
        at groovy.ui.Console.<init>(Console.groovy:224)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
        at java.lang.reflect.Constructor.newInstance(Unknown Source)
        at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:83)
        at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:105)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:60)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:235)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:247)
        at groovy.ui.Console.main(Console.groovy:209)
        ... 6 more

我使用的lib在eclipse中使用java工作得很好。我该怎么办?

其他问题:

我找到了一种通过加载文件来使用库的方法。有没有办法用jar文件加载intire目录?

this.getClass().classLoader.rootLoader.addURL(new File("file.jar").toURL())

1 个答案:

答案 0 :(得分:2)

您不应将脚本依赖项添加到%GROOVY_HOME%/lib

您应该更改脚本以声明所需的依赖项。

一种方法是将JAR URL添加到类加载器中。如果要添加目录,请列出目录并迭代JAR文件,例如new File('path/to/dir').eachFileMatch('*.jar') { ...addURL(it.toURI().toURL()) }

顺便说一下。正如您在我的示例中所看到的,您永远不应该使用File.toURL(),这已经被弃用了很长时间。始终改为File.toURI().toURL()

除此之外,还有一种更好的方法来依赖Groovy脚本中的库,即Grape。您可以在http://groovy-lang.org/grape.html了解更多相关信息。基本上,您只需使用注释声明依赖项,它们将自动从Maven存储库下载并添加到脚本的类路径中,包括任何传递依赖项。