我目前正在将Jasper API添加到我们的项目中,并且我已经进行了JUnit测试来测试连接。我们的Maven项目架构是一个父项目,有一些内部项目。
我已将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>
我已将它添加到内部项目中,该项目需要jasper依赖项进行单元测试:
<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更新后; 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,这正是我所需要的,但这个链接并没有真正举例说明如何配置它。
我也尝试了以下小'tutorial',但没有添加内部依赖项..
如何通过Maven添加所有内部依赖关系jar而不将它们全部手动添加到pom中?我认为这是在范围为compile
时自动完成的(这是默认设置,虽然我也尝试过明确设置以防万一 - 但没有任何区别)。
编辑:当我使用mvn dependency:tree
目标构建项目时,它会显示Jasper jar的以下两行:
[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时,它转到.getWSClient()
行,实际错误发生在junit.framework.TestCase#runTest()
中,带有以下Stacktrace:
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
这是某种导致ClassNotFoundException
的UnitTest(TestCase类)反射问题。所以它给出这些错误的类不是两个Jasper API jar的内部依赖,所以我不得不手动添加它们,即使我不直接在我自己的代码中使用它们?或者我还能以某种方式使用传递性吗?