Filip Piechowski
01/17/2023, 5:17 PMsourceSets {
val port by creating {}
val adapter by creating {
runtimeClasspath += port.output
compileClasspath += port.output
}
main {
runtimeClasspath += port.output
compileClasspath += port.output
runtimeClasspath += adapter.output
compileClasspath += adapter.output
}
}
I also made changes to the configurations:
configurations {
val portImplementation by getting {}
val portRuntimeOnly by getting {}
val adapterImplementation by getting {
extendsFrom(portImplementation)
}
val adapterRuntimeOnly by getting {
extendsFrom(portRuntimeOnly)
}
implementation {
extendsFrom(portImplementation)
extendsFrom(adapterImplementation)
}
runtimeOnly {
extendsFrom(portRuntimeOnly)
extendsFrom(adapterRuntimeOnly)
}
}
IntelliJ is able to compile and run the project (no unresolved references, runs by run
gradle task from application plugin), but when creating or running a fat jar (runShadow
from application plugin or runFatJar
from ktor plugin) i get java.lang.ClassNotFoundException
for classes from adapter
or port
source sets.
How to link the source sets properly for running app’s fatJar?Adam S
01/17/2023, 5:55 PMAdam S
01/17/2023, 5:57 PMAdam S
01/17/2023, 6:00 PM.
├── my-project/
│ ├── feature1-adapter/
│ │ └── build.gradle.kts
│ ├── feature1-core/
│ │ └── build.gradle.kts
│ └── feature1-port/
│ └── build.gradle.kts
├── setttings.gradle.kts
└── build.gradle.kts
Filip Piechowski
01/17/2023, 6:12 PMAdam S
01/17/2023, 6:14 PMinternal
was a bit more granular. As an alternative some projects use a @RequiresOptIn
annotation https://kotlinlang.org/docs/opt-in-requirements.html#opt-in-to-using-apiFilip Piechowski
01/17/2023, 7:25 PMtasks.named<ShadowJar>("shadowJar") {
from(sourceSets["adapter"].output, sourceSets["port"].output)
}