2013-05-09 114 views
2

我使用javax.mail库来发送可能包含或不包含附件的电子邮件。@GrabConfig的替代方案?

我还使用Groovy 2.0.6编写此脚本,并在Eclipse中开发它,并使用Gradle 1.5运行单元测试。我正在编写的脚本将在未来的许多不同位置部署到一个jar中。因此,需要从我的脚本引用javax.mail,而不是手动添加到机器的类路径中。

要做到这一点,我用我的脚本如下语句:

@GrabConfig(systemClassLoader=true) 
@Grab(group='javax.mail', module='mail', version='1.4.7') 

我的问题是,我无法同时包含在@GrabConfig语句摇篮运行单元测试。它只用@Grab语句就可以正常运行,但当@GrabConfig在那里时会失败。我收到的错误信息是:

:compileJava UP-TO-DATE 
:compileGroovy 
startup failed: 

General error during conversion: No suitable ClassLoader found for grab 

java.lang.RuntimeException: No suitable ClassLoader found for grab 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
     at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:77) 
     at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrapNoCoerce.callConstructor(ConstructorSite.java:102) 
     at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:57) 
     at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:182) 
     at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:190) 
     at groovy.grape.GrapeIvy.chooseClassLoader(GrapeIvy.groovy:181) 
     at groovy.grape.GrapeIvy$chooseClassLoader.callCurrent(Unknown Source) 
     at groovy.grape.GrapeIvy.grab(GrapeIvy.groovy:247) 
     at groovy.grape.Grape.grab(Grape.java:141) 
     at groovy.grape.GrabAnnotationTransformation.visit(GrabAnnotationTransformation.java:312) 
     at org.codehaus.groovy.transform.ASTTransformationVisitor$3.call(ASTTransformationVisitor.java:319) 
     at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:903) 
     at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:566) 
     at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:542) 
     at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:519) 
     at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:498) 
     at org.gradle.api.internal.tasks.compile.ApiGroovyCompiler.execute(ApiGroovyCompiler.java:118) 
     at org.gradle.api.internal.tasks.compile.ApiGroovyCompiler.execute(ApiGroovyCompiler.java:39) 
     at org.gradle.api.internal.tasks.compile.daemon.CompilerDaemonServer.execute(CompilerDaemonServer.java:52) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
      at java.lang.reflect.Method.invoke(Method.java:597) 
      at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) 
      at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) 
      at org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:355) 
      at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:66) 
      at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
      at java.lang.Thread.run(Thread.java:662) 

    1 error 

    :compileGroovy FAILED 

    FAILURE: Build failed with an exception. 

No suitable classloader found for grab@GrabConfig使得代码不可测。

对于我的情况,有没有其他选择@GrabConfig

+0

邮件JAR添加到类路径? – 2013-05-09 21:11:52

+0

@tim_yates正如问题中所述,这不是我的情况的一种选择,因为jar会自动部署到不同的机器上,我需要javax.mail jar来引用和使用,而无需任何手动步骤。 – twbbas 2013-05-09 21:15:00

回答

2

您可以使用gradle-one-jar插件将您自己的和第三方代码打包到单个可执行文件Jar中。或者,您可以使用Gradle的application插件来创建带有启动脚本的Zip分配。

1

您可以像这样在的build.gradle禁用葡萄:

test {           
    systemProperty 'groovy.grape.enable', 'false' 
} 

compileGroovy { 
    groovyOptions.forkOptions.jvmArgs = [ '-Dgroovy.grape.enable=false' ] 
} 
compileTestGroovy { 
    groovyOptions.forkOptions.jvmArgs = [ '-Dgroovy.grape.enable=false' ] 
}