Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unresolved Dependency on package in subproject

In my Kotlin spring boot project, I am using Kotlin DSL Gradle, with three subprojects. Two of which are security which depends on database.

In IntelliJ, the application runs successfully and performs as expected (when run as a Spring Boot application run config).

However, when I try to build the project with Gradle ./gradlew clean build I get

e: /security/src/main/kotlin/com/path/security/jwt/JwtRealm.kt: (3, 26): Unresolved reference: database
e: /security/src/main/kotlin/com/path/security/jwt/JwtRealm.kt: (19, 24): Unresolved reference: UsersRepository
e: /security/src/main/kotlin/com/path/security/jwt/JwtRealm.kt: (36, 48): Unresolved reference: it
e: /security/src/main/kotlin/com/path/security/jwt/JwtRealm.kt: (38, 42): Unresolved reference: it
e: /security/src/main/kotlin/com/path/security/jwt/JwtRealm.kt: (38, 75): Unresolved reference: it
e: /security/src/main/kotlin/com/path/security/jwt/JwtRealm.kt: (40, 63): Unresolved reference: it
> Task :security:compileKotlin FAILED

The actual line it is complaining about is:

import com.path.database.repositories.UsersRepository

The it error are values from the repo. The UserRepository class is in the module database and the JwtRealm is in the security module.

My build.gradle.kts file in the security module looks like this:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

group = "com.path"
version = "1.0-SNAPSHOT"

plugins {
    kotlin("jvm")
    id("org.jetbrains.kotlin.plugin.spring") 
    id("org.jetbrains.kotlin.plugin.noarg") 
    id("org.jetbrains.kotlin.plugin.jpa") 
    id("org.springframework.boot")
    id("io.spring.dependency-management")
}

repositories {
    mavenCentral()
}

dependencies {
    implementation(kotlin("stdlib-jdk8"))
    implementation(kotlin("reflect"))

    implementation(project(":database"))

    implementation("org.springframework.boot:spring-boot-starter-web:2.1.1.RELEASE")
    implementation("org.springframework.boot:spring-boot-starter-actuator:2.1.1.RELEASE")
    implementation("org.springframework.boot:spring-boot-starter-data-jpa:2.1.1.RELEASE")
    implementation("org.springframework.boot:spring-boot-starter-jdbc:2.1.1.RELEASE")

    implementation("org.apache.shiro:shiro-spring-boot-web-starter:1.4.0")
    implementation("com.h2database:h2:1.4.197")
    implementation("com.auth0:java-jwt:3.4.1")
    implementation("io.github.microutils:kotlin-logging:1.6.22")
}

tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "1.8"
    kotlinOptions.freeCompilerArgs = listOf("-Xjsr305=strict")
}

Which is basically the same as my root project Gradle files, only that also contains references to all the subprojects (or modules). I've also listed all the subprojects in the settings.gradle.kts

IntelliJ has no problem running, or browsing this code, there are no highlighted errors or warnings.

I have an @Configuration annotated class as the root of each module with @ComponentScan annotation also.

What am I missing?

like image 777
Jumwah Avatar asked Dec 14 '18 07:12

Jumwah


1 Answers

After a lot of digging I found that this was a Spring Boot issue. I fixed this by applying

bootJar.enabled = false  
jar.enabled = true

to each of the subprojects. In KotlinDSL this is:

tasks.withType<BootJar> {
    enabled = false
}
tasks.withType<Jar> {
    enabled = true
}

I hope this helps someone else, as I only found this issue after a lot of digging. Source of the solution is here: https://github.com/gradle/kotlin-dsl/issues/393

like image 133
Jumwah Avatar answered Oct 04 '22 18:10

Jumwah