Correct way to declare multiple scope for Maven dependency?

[亡魂溺海] 提交于 2020-03-17 06:28:07

问题


I have a dependency that I want to use in test scope (so that it is in the classpath when I am running unit tests), and in runtime scope (so that I can contain that in WAR/EAR/other packaging for deployment, but not affecting transitive dependency lookup for dependent artifacts).

A real life example is SLF4J's implementation JARs (e.g. Logback). I want it to exist in the classpath when I am running tests, and I want it to be included in my WAR/EAR, but I don't want project depending on my project to include that in transitive dependency lookup.

I tried to use <scope>test,runtime</scope> but Maven 3 produces a warning:

[WARNING] 'dependencies.dependency.scope' for org.slf4j:jcl-over-slf4j:jar 
must be one of [provided, compile, runtime, test, system] but is 'test,runtime'. 

What is the right way for declaring the dependency scope in such a case?


回答1:


The runtime scope also makes the artifact available on the test classpath. Just use runtime. (See the Maven documentation.)

To avoid having the dependency resolved transitively, also make it optional with <optional>true</optional>:

<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback</artifactId>
  <version>0.5</version>
  <scope>runtime</scope>
  <optional>true</optional>
</dependency>



回答2:


You can only define one scope value per <scope/> tag.

I'm afraid what you'd like to do cannot be achieved by merely using a scope. If you define a scope of test, it will only be available during tests; if you define a scope of provided, that would mean that you would expect that dependency for your project to be resolved and used during both compilation and tests, but it will not be included in your WAR file. Either way, it's not what you would want.

Therefore, I would recommend you have a look at the maven-assembly-plugin, with which you can achieve it, but it will still require some playing around.




回答3:


Declaring a dependency with a scope of runtime ensures that the library is not available during compile time.

Declaring the dependency as optional causes a break in the dependency resolution process; projects depending on your libraries will need to explicitly include the dependencies themselves.

So the correct way to declare this would be:

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>jcl-over-slf4j</artifactId>
  <version>1.7.13</version>
  <scope>runtime</scope>
  <optional>true</optional>
</dependency>


来源:https://stackoverflow.com/questions/14601607/correct-way-to-declare-multiple-scope-for-maven-dependency

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!