如何创建只在运行时在类路径中接收依赖的类?

时间:2017-04-03 18:18:36

标签: java maven

我为一家公司工作,该公司将我们的产品作为jar文件分发,并且我正在尝试编写能够使用各种输入测试这些罐子的过去版本的东西。理想情况下,我可以运行像

这样的测试框架
java -jar testframework.jar -cp "version1.jar"

java -jar testframework.jar -cp "version2.jar"

获得不同的输出。由于输入的方法是一成不变的,我认为我可以依赖于我们的产品范围"提供"或者"运行时"在maven中,然后在类路径中提供的任何jar版本上调用输入方法。像这样:

<dependency>
  <groupId>com.ourCompany</groupid>
  <artifactId>ourProduct</artifactId>
  <scope>provided</scope>
</dependency>

然后在主要的TestFramework类中:

public static void main(String[] args) {
  ProductClass.doSomething();
}

但是,我收到的编译错误是doSomething方法不存在。我想我完全误解了&#34;提供了什么&#34;和&#34;运行时&#34;关于maven依赖关系的意思,但我还没有能够找到解释我的错误的任何资源。有谁知道我怎么做我想做的事情?

2 个答案:

答案 0 :(得分:1)

  

ProductClass肯定存在于ProductJar中。它没有   导入类的问题,只需调用方法doSomething。和   当我使用provided范围时,我收到了这个错误。

因为您确认JAR存在,所以问题与您指向的JAR文件的版本类似,因此请指定 <version>X</version> (其中{{1} ()方法存在)以及doSomething并且应该解决问题。

  

我误解了“提供”和“运行时”的含义   尊重maven依赖

<dependency>provided范围完全不同,它们用于两个不同的目的。

runtime范围意味着在编译和测试时间期间需要依赖关系(但是,依赖关系JAR不会作为JAR打包的一部分捆绑,因此JAR应该可用在容器类路径中)

provided范围意味着仅在程序的执行期间需要依赖关系,而不是在编译时。

答案 1 :(得分:0)

依赖项始终需要在编译时可用。否则,编译器如何能够知道您的代码是否有效?检查您在依赖项中声明的版本是否确实具有您要使用的doSomething方法。如果不是,则需要将版本更改为具有该方法的版本。