2

ライブラリを使用して、javax.mail添付ファイルを含む場合と含まない場合がある電子メールを送信しています。

また、このスクリプトを作成するために 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 ステートメントが含まれている間、Gradle で単体テストを実行できないことです。@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.

Grabに適したクラスローダーが見つかりません によると、@GrabConfigコードをテストできなくなります。

@GrabConfig私の状況に代わるものはありますか?

4

2 に答える 2

2

gradle-one-jarプラグインを使用して、独自のコードとサードパーティのコードを単一の実行可能な Jar にパッケージ化できます。または、Gradle のapplicationプラグインを使用して、開始スクリプトを含む Zip ディストリビューションを作成することもできます。

于 2013-05-10T07:16:58.767 に答える
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' ]
}
于 2013-07-20T02:53:56.550 に答える