2017-08-31 66 views
0

我在java中編寫了一個程序,現在我想用groovy來運行它。我做了這個練習,所以不要質疑爲什麼我一開始就沒有用Groovy編程。 ;)Groovy的Java項目 - 庫不起作用

我在java中使用了很多庫,所以我將它們複製到%GROOVY_HOME%\lib目錄中。我這樣做,我無法再運行groovyConsole.exe,所以跑groovyConsole.bat(使用CMD)獲得錯誤,這是繼:我在Eclipse中使用工作正常

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 

的庫使用java。我能做什麼?

附加問題:

我找到了一種通過加載文件來使用庫的方法。有沒有辦法用jar文件加載裝入目錄?

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

不要將任何東西拷貝到%Groovy_Home%/ lib,將它們設置爲適當的類路徑依賴關係,或者使用陰影/陰影插件生成一個胖罐子 –

+2

您不應該在'GROOVY_HOME/lib'。而是使用classpath來包含你的庫。 – Rao

回答

2

您不應將腳本依賴項添加到%GROOVY_HOME%/lib

您應該改變腳本來聲明它所需的依賴關係。

一種方法是按照向類加載器添加JAR URL發現的方式進行操作。如果你想添加一個目錄,列出目錄並遍歷JAR文件,如new File('path/to/dir').eachFileMatch('*.jar') { ...addURL(it.toURI().toURL()) }

Btw。正如你在我的例子中可以看到的,你永遠不應該使用File.toURL(),這是很久以來不推薦使用的。改爲始終做File.toURI().toURL()

除此之外,還有一種更好的方法可以依賴Groovy腳本中的庫,即Grape。你可以在http://groovy-lang.org/grape.html閱讀更多關於它的信息。基本上你只需用註釋聲明你的依賴關係,它們就會自動從Maven倉庫下載並添加到腳本的類路徑中,包括任何傳遞依賴關係。