bootRepackage fails to package dependencies from the new gradle Java Library plugin
See original GitHub issueBug report
When using the new Gradle Java Library plugin and declaring dependencies using the api or implementation configurations, the bootRepackage task doesn’t package the dependencies into the final jar.
If I replace the declared dependencies using the compile configuration, then the bootRepackage task does package them into the jar. However, the gradle documentation says to ignore this configuration:
The compile, testCompile, runtime and testRuntime configurations inherited from the Java plugin are still available but are deprecated. You should avoid using them, as they are only kept for backwards compatibility.
Example:
/*
* This build file was generated by the Gradle 'init' task.
*
* This generated file contains a sample Java Library project to get you started.
* For more details take a look at the Java Libraries chapter in the Gradle
* user guide available at https://docs.gradle.org/3.5/userguide/java_library_plugin.html
*/
// Apply the java-library plugin to add support for Java Library
apply plugin: 'java-library'
apply plugin: 'org.springframework.boot'
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath "org.springframework.boot:spring-boot-gradle-plugin:1.5.3.RELEASE"
}
}
// In this section you declare where to find the dependencies of your project
repositories {
// Use jcenter for resolving your dependencies.
// You can declare any Maven/Ivy/file repository here.
jcenter()
}
springBoot {
mainClass = 'Library'
}
dependencies {
// This dependency is exported to consumers, that is to say found on their compile classpath.
api 'org.apache.commons:commons-math3:3.6.1'
// This dependency is used internally, and not exposed to consumers on their own compile classpath.
implementation 'com.google.guava:guava:21.0'
// Use JUnit test framework
testImplementation 'junit:junit:4.12'
}
Issue Analytics
- State:
- Created 6 years ago
- Reactions:1
- Comments:6 (2 by maintainers)
Top Results From Across the Web
How to build not executable jar (library) with Spring Boot ...
Now I'm using spring plugin with 2.1.* version in all my libs. It is necessary to add next before 'dependencies' section:
Read more >67. Spring Boot Gradle plugin
The Spring Boot Gradle Plugin provides Spring Boot support in Gradle, allowing you to package executable jar or war archives, run Spring Boot...
Read more >The Java Library Plugin - Gradle User Manual
Prefer the implementation configuration over api when possible. This keeps the dependencies off of the consumer's compilation classpath. In addition, the ...
Read more >Spring Boot Gradle Plugin - Baeldung
The Spring Boot Gradle plugin helps us manage Spring Boot dependencies, as well as package and run our application when using Gradle as...
Read more >3 Upgrading from the previous versions 5.2.5
To make the dependencies available again you have to declare them with api configuration. You also have to apply the java-library gradle plugin...
Read more >
Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free
Top Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found

@wilkinsona thank you for posting the workaround, it helped me use the new
implementationdependency type in Gradle 4.7 (ascompileis deprecated in both the Java plugin and the Java Library plugin). I had to change it tocustomConfiguration = 'custom'to match the new configuration’s nameThe repackaging includes everything in the
runtimeconfiguration which is why dependencies in theapiandimplementationconfigurations are not being included. 2.0 snapshots are not affected by this problem as the newbootJartask doesn’t deal with configurations directly. Instead, it uses the runtime class path of the main source set.In 1.5 and earlier, you can configure a custom configuration that will have its dependencies packaged in the jar. Ideally, this would be possible:
Unfortunately, it fails as Gradle does not allow the
implementationconfiguration to be resolved directly. Instead, you need to introduce some indirection in the form of another configuration that extendsimplementation:With this in place, both
commons-math3andguavaare included in the jar.