我目前正在将 Jasper API 添加到我们的项目中,并且我已经进行了 JUnit-test 来测试连接。我们的 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 全新安装;和项目建立和刷新,我尝试执行单元测试:
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的信息,这正是我所需要的,但是这个链接并没有真正给出如何配置它的示例。
我也尝试过以下小“教程”,但没有添加内部依赖项..
如何通过 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
. 所以它给出这些错误的类不是两个 Jasper API jar 的内部依赖关系,所以即使我没有在自己的代码中直接使用它们,我也被迫手动添加它们?或者我还能以某种方式使用传递性吗?