私は現在、プロジェクトに Jasper API を追加する過程にあり、接続をテストするために JUnit テストを作成しました。私たちの Maven プロジェクト アーキテクチャは、いくつかの内部プロジェクトを持つ 1 つの親プロジェクトです。
jasper に必要な依存関係を親 pom に追加しました。
<dependencyManagement>
<dependencies>
...
<dependency>
<groupId>com.jaspersoft.jasperserver</groupId>
<artifactId>jasperserver-common-ws</artifactId>
<version>5.5.0</version>
</dependency>
<dependency>
<groupId>com.jaspersoft.jasperserver</groupId>
<artifactId>jasperserver-ireport-plugin</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>
</dependencyManagement>
そして、単体テストにジャスパーの依存関係を必要とする内部プロジェクトにそれを追加しました。
<dependencies>
...
<dependency>
<groupId>com.jaspersoft.jasperserver</groupId>
<artifactId>jasperserver-common-ws</artifactId>
</dependency>
<dependency>
<groupId>com.jaspersoft.jasperserver</groupId>
<artifactId>jasperserver-ireport-plugin</artifactId>
</dependency>
</dependencies>
Maven Update を実行した後。Maven クリーン インストール; およびプロジェクトのビルドと更新、UnitTest を実行しようとしています。
package jasper;
import org.junit.Assert;
import org.junit.Test;
import com.jaspersoft.jasperserver.api.metadata.xml.domain.impl.ResourceDescriptor;
import com.jaspersoft.jasperserver.irplugin.JServer;
import junit.framework.TestCase;
public class JasperApiTest extends TestCase{
private JServer jasperServer;
public ResourceDescriptor get(String uri) throws Exception{
ResourceDescriptor rd = new ResourceDescriptor();
rd.setUriString(uri);
return this.jasperServer.getWSClient().get(rd, null, null);
}
@Override
protected void setUp(){
this.jasperServer = new JServer();
this.jasperServer.setName("__ourName__");
this.jasperServer.setPassword("__ourPassword__");
this.jasperServer.setUrl("__ourServer__/jasperserver-pro/services/repository");
}
@Test
public void testJasperApi(){
try{
ResourceDescriptor rd = get("/test");
Assert.assertNotNull(rd);
} catch(Exception ex){
Assert.fail("Failed: " + ex);
}
}
}
今の問題は、それがjava.lang.ClassNotFoundException
. 最初はorg.apache.axis.EngineConfiguration
. これを に明示的に追加するpom
と、次の に移動しますClassNotFoundException
が、今回はorg.apache.commons.logging.LogFactory
. これも追加すると、次の内部依存関係に続きます。
私はこれらの依存関係を自分で使用していないため、Jasper のみを使用しているため、それらを追加する必要はありませんが、Maven に自動的に追加してもらうだけです。だから、 Transitive_Dependenciesについて読んだことがありますが、これはまさに私が必要としているものですが、このリンクは実際にこれを構成する方法の例を示していませんでした。次の小さな「チュートリアル」
も試しましたが、内部の依存関係は追加されません..
すべての内部依存関係 jar を手動で pom に追加せずに、Maven を介して追加するにはどうすればよいですか? スコープがある場合、これは自動的に行われると思いましたcompile
(これはデフォルトですが、念のために明示的に設定しようとしましたが、違いはありません)。
編集:目標を持ってプロジェクトをビルドするとmvn dependency:tree
、Jasper jar の次の 2 行が表示されます。
[INFO] | +- com.jaspersoft.jasperserver:jasperserver-common-ws:jar:5.5.0:compile
[INFO] | \- com.jaspersoft.jasperserver:jasperserver-ireport-plugin:jar:3.0.0:compile
ただし、内部依存関係がないため、追加されていません。
しかし、UnitTest をデバッグすると、次の Stacktrace で.getWSClient()
実際のエラーが発生します。junit.framework.TestCase#runTest()
java.lang.NoClassDefFoundError: org/apache/axis/EngineConfiguration
at com.jaspersoft.jasperserver.irplugin.JServer.getWSClient(JServer.java:102)
at jasper.JasperApiTest.get(JasperApiTest.java:20)
at jasper.JasperApiTest.testJasperApi(JasperApiTest.java:34)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at junit.framework.TestCase.runTest(TestCase.java:176)
at junit.framework.TestCase.runBare(TestCase.java:141)
at junit.framework.TestResult$1.protect(TestResult.java:122)
at junit.framework.TestResult.runProtected(TestResult.java:142)
at junit.framework.TestResult.run(TestResult.java:125)
at junit.framework.TestCase.run(TestCase.java:129)
at junit.framework.TestSuite.runTest(TestSuite.java:252)
at junit.framework.TestSuite.run(TestSuite.java:247)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:86)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.lang.ClassNotFoundException: org.apache.axis.EngineConfiguration
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 22 more
これは、何らかの種類の UnitTest (TestCase クラス) リフレクションの問題で、ClassNotFoundException
. これらのエラーが発生するクラスは、2 つの Jasper API jar の内部依存関係ではないため、自分のコードで直接使用していなくても、すべて手動で追加する必要がありますか? それとも、どうにかして推移性を使用できますか?