如何将依赖项指定为传递,因此它自动包含所有内部依赖项?

时间:2016-11-16 10:57:43

标签: java maven dependencies pom.xml transitive-dependency

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

0 个答案:

没有答案