0

我目前正在将 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 的内部依赖关系,所以即使我没有在自己的代码中直接使用它们,我也被迫手动添加它们?或者我还能以某种方式使用传递性吗?

4

0 回答 0