Home > Software design >  Meaning of Maven dependency scopes "compile" vs. "runtime"
Meaning of Maven dependency scopes "compile" vs. "runtime"

Time:12-08

From the viewpoint of a Gradle java library author, I understand that a dependency specified in the implementation configuration will be marked with the runtime scope in the resulting POM file that gets published (using the maven-publish Gradle plugin). This makes sense, as anyone consuming my published library doesn't need the dependency for compilation (it is an internal dependency), but instead only for runtime. If I specify a dependency in the api configuration, it will be marked with the compile scope in the resulting POM file, which again makes sense, as anyone consuming my library needs this for compilation (and runtime).

This makes me believe that the meaning of the Maven dependency scope is relative to anyone consuming the component, and not relative to the component itself. Consider a published Maven library (containing Java class files) a dependency marked with compile should mean:

If you compile against me, then use this dependency on the compilation classpath too!

However, according to the Maven docs, it seems that it means:

I was compiled with that dependency on my compilation classpath, and if you want to compile me again, do the same!

If this were true, then one could not distinguish between API-dependencies and implementation-dependencies like Gradle does. Also, it would only make sense if the published component actually contains the sources, not only the class files.

Did Gradle actually "misuse" the meaning of these scopes to make some improvements, or did I fundamentally misunderstand something?

CodePudding user response:

Gradle cleverly "misuses" the scopes.

Maven has the design flaw that the build POM is published 1:1 as consumer POM (this will change with the upcoming Maven 4.x). So Maven does not have the chance to use something for compilation in the project, but for runtime when consumed by another project (at least not without applying tricks). The Maven docs therefore do not discuss the possibility of "implementation/api".

  • Related