Steve Ebersole
10/29/2024, 6:16 PMThe SLF4J binding actually used is not supported by Maven: org.gradle.internal.logging.slf4j.OutputEventListenerBackedLoggerContext
Maven supported bindings are:
(from jar:file:/home/sebersole/.gradle/caches/modules-2/files-2.1/org.apache.maven/maven-embedder/3.9.9/fb988b4e85cec2686e56da94769cbf73298ef3ee/maven-embedder-3.9.9.jar!/META-INF/maven/slf4j-configuration.properties)
- org.slf4j.impl.SimpleLoggerFactory
- org.slf4j.impl.MavenSimpleLoggerFactory
- ch.qos.logback.classic.LoggerContext
- org.apache.logging.slf4j.Log4jLoggerFactory
But I cannot figure out how to resolve this. I've replaced sysout and syserr for the embedder calls. And I tried adding a different slf4j binding in the dependencies. All with no luck.
Here is the Gradle project:
dependencies {
implementation gradleApi()
implementation "org.apache.maven:maven-embedder:3.9.9"
implementation "org.apache.maven:maven-compat:3.9.9"
implementation "org.apache.maven.resolver:maven-resolver-connector-basic:1.9.18"
implementation "org.apache.maven.resolver:maven-resolver-transport-http:1.9.18"
implementation "org.slf4j:slf4j-reload4j:2.0.16"
}
gradlePlugin {
plugins {
register( "mavenEmbedder" ) {
id = "maven-embedder"
implementationClass = "org.hibernate.build.maven.embedder.MavenEmbedderPlugin"
}
}
}
I'm not sure where embedder is finding the Gradle OutputEventListenerBackedLoggerContext.
Any ideas? Thanks!Steve Ebersole
10/29/2024, 6:20 PMVampire
10/30/2024, 3:50 AMSteve Ebersole
10/30/2024, 2:00 PMSteve Ebersole
10/30/2024, 2:00 PMVampire
10/30/2024, 2:02 PMSteve Ebersole
10/30/2024, 2:04 PMSteve Ebersole
10/30/2024, 2:05 PMSteve Ebersole
10/30/2024, 2:05 PMVampire
10/30/2024, 2:09 PMSteve Ebersole
10/30/2024, 2:10 PMSteve Ebersole
10/30/2024, 2:20 PMSteve Ebersole
10/30/2024, 4:00 PMSteve Ebersole
10/30/2024, 4:00 PMSteve Ebersole
10/30/2024, 4:02 PMVampire
10/30/2024, 4:07 PMRelated to this question, is there a way for a plugin to get access to its Configuration(s)? I'm talking about the dependencies defined on the pllugin project.
I think not, but never hurts to askWhat exactly is the use-case, depending on that the answer might vary 🙂 If you for example just need some resource from some dependency jar, just use the usual resource access on class or class loader. If you mean to actually access the jars for example to use them for some external Java process / process isolation worker / ..., there are quite hacky ways, but you should not even think about doing so, as Gradle manipulates the byte-code of the classpath of Gradle logic to automatically recognize configuration cache input and if you use those instrumented jars outside of Gradle logic, it will fail to find classes put in by that instrumentation.
(fwiw I did find Gradle's role in this... it simply uses its own "shaded" slf4j )Even it it does, that would be quite irrelevant. It provides an own SLF4J binding as I said. And that is exactly the expected thing to do as explained above. That someone that logs with SLF4J only supports certain bindings, that sounds like big bullshit.
Steve Ebersole
10/30/2024, 4:11 PMWhat exactly is the use-case...Maven Embedder accepts a Plexus "ClassWorld" which is a super complicated take on a ClassLoader. I am trying to build a ClassWorld that has just needed Maven dependencies. At the moment, because I do not supply that, Maven Embedder simply uses the current VClassLoader. The easiest way to do this would be to define this ClassLoader as a Gradle Configuration and use that to access the files ad build that ClassWorld. It would suck to have to define a named Configuration on the project using the plugin just to specify the Maven dependencies (which are logically part of the plugin)
Vampire
10/30/2024, 4:19 PMSteve Ebersole
10/30/2024, 4:21 PMSteve Ebersole
10/30/2024, 4:22 PMimplementation for the plugin needs to be on its classpath when it executes)Steve Ebersole
10/30/2024, 4:22 PMSteve Ebersole
10/30/2024, 4:23 PMVampire
10/30/2024, 4:24 PMgetClass().getClassLoader(). But as I said, you are not supposed to use it out of Gradle infrastructure due to the instrumentation. No idea whether that applies in your case.Steve Ebersole
10/30/2024, 4:25 PMgetClassLoader() won't work unfortunately.Steve Ebersole
10/30/2024, 4:26 PMSteve Ebersole
10/30/2024, 4:26 PMVampire
10/30/2024, 4:27 PMSteve Ebersole
10/30/2024, 4:28 PMSteve Ebersole
10/30/2024, 4:28 PMVampire
10/30/2024, 4:30 PMConfigurableFileCollection and then do from(theConfiguration) on the parameterVampire
10/30/2024, 4:30 PMSteve Ebersole
10/30/2024, 6:01 PMVampire
10/30/2024, 6:02 PMSteve Ebersole
10/30/2024, 6:02 PMSteve Ebersole
10/30/2024, 6:03 PMVampire
10/30/2024, 6:03 PMSteve Ebersole
10/30/2024, 6:03 PMSteve Ebersole
10/30/2024, 6:03 PMSteve Ebersole
10/30/2024, 6:04 PMSteve Ebersole
10/30/2024, 6:05 PMVampire
10/30/2024, 6:14 PMabstract class MyService : BuildService<MyService.Parameters> {
init {
parameters.files.forEach { println(it.name) }
}
interface Parameters : BuildServiceParameters {
val files: ConfigurableFileCollection
}
}
val foo = configurations.dependencyScope("foo")
val bar = configurations.resolvable("bar") {
extendsFrom(foo.get())
}
dependencies {
foo("org.apache.maven:maven-embedder:3.9.7")
}
gradle.sharedServices.registerIfAbsent("my-service", MyService::class) {
parameters {
files.from(bar)
}
}.get()
=>
maven-embedder-3.9.7.jar
maven-core-3.9.7.jar
maven-settings-builder-3.9.7.jar
maven-settings-3.9.7.jar
maven-plugin-api-3.9.7.jar
maven-resolver-provider-3.9.7.jar
maven-model-builder-3.9.7.jar
maven-model-3.9.7.jar
maven-builder-support-3.9.7.jar
maven-resolver-impl-1.9.20.jar
maven-resolver-util-1.9.20.jar
maven-resolver-spi-1.9.20.jar
maven-resolver-api-1.9.20.jar
maven-shared-utils-3.4.2.jar
guice-5.1.0.jar
guava-33.2.0-jre.jar
failureaccess-1.0.2.jar
plexus-sec-dispatcher-2.0.jar
plexus-cipher-2.0.jar
javax.inject-1.jar
org.eclipse.sisu.plexus-0.9.0.M2.jar
javax.annotation-api-1.3.2.jar
maven-repository-metadata-3.9.7.jar
maven-artifact-3.9.7.jar
plexus-utils-3.5.1.jar
plexus-classworlds-2.8.0.jar
plexus-interpolation-1.27.jar
maven-resolver-named-locks-1.9.20.jar
slf4j-api-1.7.36.jar
commons-cli-1.7.0.jar
commons-lang3-3.14.0.jar
org.eclipse.sisu.inject-0.9.0.M2.jar
plexus-component-annotations-2.1.0.jar
aopalliance-1.0.jarSteve Ebersole
10/30/2024, 6:16 PMSteve Ebersole
10/30/2024, 6:18 PM> Could not create an instance of type org.hibernate.build.maven.embedder.MavenEmbedderService.
> org/apache/commons/cli/ParseException
Its complaining because org/apache/commons/cli/ParseException cannot be foundSteve Ebersole
10/30/2024, 6:18 PMVampire
10/30/2024, 6:19 PMSteve Ebersole
10/30/2024, 6:19 PMVampire
10/30/2024, 6:19 PMSteve Ebersole
10/30/2024, 6:20 PMSteve Ebersole
10/30/2024, 6:20 PMSteve Ebersole
10/30/2024, 6:20 PMVampire
10/30/2024, 6:22 PM--stacktrace say? You did not really show the real error.Vampire
10/30/2024, 6:22 PMVampire
10/30/2024, 6:23 PMprintln(URLClassLoader(parameters.files.map { it.toURI().toURL() }.toTypedArray(), null).loadClass("org.apache.commons.cli.ParseException"))
=>
class org.apache.commons.cli.ParseException
so workedSteve Ebersole
10/30/2024, 6:23 PMCaused by: java.lang.NoClassDefFoundError: org/apache/maven/cli/MavenCli$ExitException
at org.hibernate.build.maven.embedder.MavenEmbedderService.resolveEmbedderConstructor(MavenEmbedderService.java:133)Steve Ebersole
10/30/2024, 6:25 PMVampire
10/30/2024, 6:25 PMSteve Ebersole
10/30/2024, 6:26 PMVampire
10/30/2024, 6:26 PMVampire
10/30/2024, 6:26 PMprintln(URLClassLoader(parameters.files.map { it.toURI().toURL() }.toTypedArray(), null).loadClass("org.apache.maven.cli.MavenCli\$ExitException"))
also works fineSteve Ebersole
10/30/2024, 6:27 PMfinal Class<?> delegateClass = loadDelegateClass( getParameters().getEmbedderDependencies() );
this.embedderDelegate = new MavenEmbedderDelegate(
getParameters().getWorkingDirectory().get().getAsFile(),
getParameters().getMavenLocalDirectory().get().getAsFile(),
delegateClass
);Steve Ebersole
10/30/2024, 6:27 PMSteve Ebersole
10/30/2024, 6:28 PMprivate static Class<?> loadDelegateClass(ConfigurableFileCollection embedderDependenciesCollection) {
System.out.println( "################################################" );
System.out.println( "`embedder` dependency files (from service) -" );
for ( File file : embedderDependenciesCollection.getFiles() ) {
System.out.println( " - " + file.getName() + " (exists - " + file.exists() + ")" );
}
System.out.println( "################################################" );
final URL[] urls = collectDependencyUrls( embedderDependenciesCollection );
try (URLClassLoader urlClassLoader = new URLClassLoader( urls )) {
return urlClassLoader.loadClass( EMBEDDER_CLASS_NAME );
}
catch (Exception e) {
throw new RuntimeException( "Unable to load Maven Embedder class", e );
}
}
private static URL @NotNull [] collectDependencyUrls(ConfigurableFileCollection embedderDependenciesCollection) {
final Set<File> embedderDependencies = embedderDependenciesCollection.getFiles();
final URL[] urls = new URL[embedderDependencies.size()];
try {
int position = 0;
for ( File embedderDependency : embedderDependencies ) {
urls[position++] = embedderDependency.toURL();
}
}
catch (Exception e) {
throw new RuntimeException( "Unable to process embedder dependencies for loading Maven Embedder class", e );
}
return urls;
}Vampire
10/30/2024, 6:28 PMabstract class MyService : BuildService<MyService.Parameters> {
init {
parameters.files.forEach { println(it.name) }
println()
println(URLClassLoader(parameters.files.map { it.toURI().toURL() }.toTypedArray(), null).loadClass("org.apache.maven.cli.MavenCli\$ExitException"))
}
interface Parameters : BuildServiceParameters {
val files: ConfigurableFileCollection
}
}
gradle.sharedServices.registerIfAbsent("my-service", MyService::class) {
parameters {
files.from(configurations.detachedConfiguration(dependencies.create("org.apache.maven:maven-embedder:3.9.7")))
}
}.get()Steve Ebersole
10/30/2024, 6:29 PMSteve Ebersole
10/30/2024, 6:29 PMVampire
10/30/2024, 6:30 PMEMBEDDER_CLASS_NAME is?Steve Ebersole
10/30/2024, 6:30 PMpublic static final String EMBEDDER_CLASS_NAME = "org.apache.maven.cli.MavenCli";Steve Ebersole
10/30/2024, 6:34 PMVampire
10/30/2024, 6:35 PMabstract class MyService : BuildService<MyService.Parameters> {
init {
parameters.files.forEach { println(it.name) }
println()
println(URLClassLoader(parameters.files.map { it.toURI().toURL() }.toTypedArray()).loadClass("org.apache.maven.cli.MavenCli"))
println(loadDelegateClass(parameters.files))
}
interface Parameters : BuildServiceParameters {
val files: ConfigurableFileCollection
}
private fun loadDelegateClass(embedderDependenciesCollection: ConfigurableFileCollection): Class<*> {
println("################################################")
println("`embedder` dependency files (from service) -")
for (file in embedderDependenciesCollection.files) {
println(" - ${file.name} (exists - ${file.exists()})")
}
println("################################################")
val urls: Array<URL?>? = collectDependencyUrls(embedderDependenciesCollection)
URLClassLoader(urls).use { urlClassLoader ->
return urlClassLoader.loadClass("org.apache.maven.cli.MavenCli")
}
}
private fun collectDependencyUrls(embedderDependenciesCollection: ConfigurableFileCollection): Array<URL?>? {
val embedderDependencies = embedderDependenciesCollection.files
val urls: Array<URL?> = arrayOfNulls<URL>(embedderDependencies.size)
var position = 0
for (embedderDependency in embedderDependencies) {
urls[position++] = embedderDependency.toURI().toURL()
}
return urls
}
}
gradle.sharedServices.registerIfAbsent("my-service", MyService::class) {
parameters {
files.from(configurations.detachedConfiguration(dependencies.create("org.apache.maven:maven-embedder:3.9.7")))
}
}.get()
=>
maven-embedder-3.9.7.jar
maven-core-3.9.7.jar
maven-settings-builder-3.9.7.jar
maven-settings-3.9.7.jar
maven-plugin-api-3.9.7.jar
maven-resolver-provider-3.9.7.jar
maven-model-builder-3.9.7.jar
maven-model-3.9.7.jar
maven-builder-support-3.9.7.jar
maven-resolver-impl-1.9.20.jar
maven-resolver-util-1.9.20.jar
maven-resolver-spi-1.9.20.jar
maven-resolver-api-1.9.20.jar
maven-shared-utils-3.4.2.jar
guice-5.1.0.jar
guava-33.2.0-jre.jar
failureaccess-1.0.2.jar
plexus-sec-dispatcher-2.0.jar
plexus-cipher-2.0.jar
javax.inject-1.jar
org.eclipse.sisu.plexus-0.9.0.M2.jar
javax.annotation-api-1.3.2.jar
maven-repository-metadata-3.9.7.jar
maven-artifact-3.9.7.jar
plexus-utils-3.5.1.jar
plexus-classworlds-2.8.0.jar
plexus-interpolation-1.27.jar
maven-resolver-named-locks-1.9.20.jar
slf4j-api-1.7.36.jar
commons-cli-1.7.0.jar
commons-lang3-3.14.0.jar
org.eclipse.sisu.inject-0.9.0.M2.jar
plexus-component-annotations-2.1.0.jar
aopalliance-1.0.jar
class org.apache.maven.cli.MavenCli
################################################
`embedder` dependency files (from service) -
- maven-embedder-3.9.7.jar (exists - true)
- maven-core-3.9.7.jar (exists - true)
- maven-settings-builder-3.9.7.jar (exists - true)
- maven-settings-3.9.7.jar (exists - true)
- maven-plugin-api-3.9.7.jar (exists - true)
- maven-resolver-provider-3.9.7.jar (exists - true)
- maven-model-builder-3.9.7.jar (exists - true)
- maven-model-3.9.7.jar (exists - true)
- maven-builder-support-3.9.7.jar (exists - true)
- maven-resolver-impl-1.9.20.jar (exists - true)
- maven-resolver-util-1.9.20.jar (exists - true)
- maven-resolver-spi-1.9.20.jar (exists - true)
- maven-resolver-api-1.9.20.jar (exists - true)
- maven-shared-utils-3.4.2.jar (exists - true)
- guice-5.1.0.jar (exists - true)
- guava-33.2.0-jre.jar (exists - true)
- failureaccess-1.0.2.jar (exists - true)
- plexus-sec-dispatcher-2.0.jar (exists - true)
- plexus-cipher-2.0.jar (exists - true)
- javax.inject-1.jar (exists - true)
- org.eclipse.sisu.plexus-0.9.0.M2.jar (exists - true)
- javax.annotation-api-1.3.2.jar (exists - true)
- maven-repository-metadata-3.9.7.jar (exists - true)
- maven-artifact-3.9.7.jar (exists - true)
- plexus-utils-3.5.1.jar (exists - true)
- plexus-classworlds-2.8.0.jar (exists - true)
- plexus-interpolation-1.27.jar (exists - true)
- maven-resolver-named-locks-1.9.20.jar (exists - true)
- slf4j-api-1.7.36.jar (exists - true)
- commons-cli-1.7.0.jar (exists - true)
- commons-lang3-3.14.0.jar (exists - true)
- org.eclipse.sisu.inject-0.9.0.M2.jar (exists - true)
- plexus-component-annotations-2.1.0.jar (exists - true)
- aopalliance-1.0.jar (exists - true)
################################################
class org.apache.maven.cli.MavenCliVampire
10/30/2024, 6:41 PMSteve Ebersole
10/30/2024, 6:42 PMVampire
10/30/2024, 6:42 PMgw help, output
19:41:22: Executing 'help'...
> Task :local-build-plugins:extractPluginRequests UP-TO-DATE
> Task :local-build-plugins:generatePluginAdapters UP-TO-DATE
> Task :local-build-plugins:compileJava UP-TO-DATE
> Task :local-build-plugins:compileGroovy NO-SOURCE
> Task :local-build-plugins:compileGroovyPlugins UP-TO-DATE
> Task :local-build-plugins:pluginDescriptors UP-TO-DATE
> Task :local-build-plugins:processResources UP-TO-DATE
> Task :local-build-plugins:classes UP-TO-DATE
> Task :local-build-plugins:jar UP-TO-DATE
> Configure project :maven-plugin-testing-plugin
################################################
`embedder` dependency files -
- maven-embedder-3.9.9.jar
- maven-compat-3.9.9.jar
- maven-resolver-connector-basic-1.9.18.jar
- maven-resolver-transport-http-1.9.18.jar
- maven-core-3.9.9.jar
- maven-plugin-api-3.9.9.jar
- maven-plugin-annotations-3.6.0.jar
- maven-project-2.2.1.jar
- slf4j-reload4j-2.0.16.jar
- maven-shared-utils-3.4.2.jar
- maven-resolver-provider-3.9.9.jar
- maven-resolver-impl-1.9.22.jar
- jcl-over-slf4j-1.7.36.jar
- maven-resolver-named-locks-1.9.22.jar
- slf4j-api-2.0.16.jar
- maven-settings-builder-3.9.9.jar
- maven-settings-3.9.9.jar
- maven-model-builder-3.9.9.jar
- maven-profile-2.2.1.jar
- maven-model-3.9.9.jar
- maven-builder-support-3.9.9.jar
- maven-resolver-util-1.9.22.jar
- maven-resolver-spi-1.9.22.jar
- maven-resolver-api-1.9.22.jar
- guice-5.1.0.jar
- guava-33.2.1-jre.jar
- failureaccess-1.0.2.jar
- plexus-sec-dispatcher-2.0.jar
- plexus-cipher-2.0.jar
- javax.inject-1.jar
- javax.annotation-api-1.3.2.jar
- org.eclipse.sisu.plexus-0.9.0.M3.jar
- maven-artifact-manager-2.2.1.jar
- maven-artifact-3.9.9.jar
- maven-repository-metadata-3.9.9.jar
- wagon-provider-api-3.5.3.jar
- maven-plugin-registry-2.2.1.jar
- plexus-container-default-1.0-alpha-9-stable-1.jar
- plexus-utils-3.5.1.jar
- plexus-classworlds-2.8.0.jar
- plexus-interpolation-1.27.jar
- commons-cli-1.8.0.jar
- plexus-component-annotations-2.1.0.jar
- httpclient-4.5.14.jar
- httpcore-4.4.16.jar
- commons-codec-1.16.0.jar
- reload4j-1.2.22.jar
- org.eclipse.sisu.inject-0.9.0.M3.jar
- aopalliance-1.0.jar
- plexus-xml-3.0.0.jar
- backport-util-concurrent-3.1.jar
- junit-3.8.1.jar
- classworlds-1.1-alpha-2.jar
################################################
################################################
`embedder` dependency files -
- maven-embedder-3.9.9.jar
- maven-compat-3.9.9.jar
- maven-resolver-connector-basic-1.9.18.jar
- maven-resolver-transport-http-1.9.18.jar
- maven-core-3.9.9.jar
- maven-plugin-api-3.9.9.jar
- maven-plugin-annotations-3.6.0.jar
- maven-project-2.2.1.jar
- slf4j-reload4j-2.0.16.jar
- maven-shared-utils-3.4.2.jar
- maven-resolver-provider-3.9.9.jar
- maven-resolver-impl-1.9.22.jar
- jcl-over-slf4j-1.7.36.jar
- maven-resolver-named-locks-1.9.22.jar
- slf4j-api-2.0.16.jar
- maven-settings-builder-3.9.9.jar
- maven-settings-3.9.9.jar
- maven-model-builder-3.9.9.jar
- maven-profile-2.2.1.jar
- maven-model-3.9.9.jar
- maven-builder-support-3.9.9.jar
- maven-resolver-util-1.9.22.jar
- maven-resolver-spi-1.9.22.jar
- maven-resolver-api-1.9.22.jar
- guice-5.1.0.jar
- guava-33.2.1-jre.jar
- failureaccess-1.0.2.jar
- plexus-sec-dispatcher-2.0.jar
- plexus-cipher-2.0.jar
- javax.inject-1.jar
- javax.annotation-api-1.3.2.jar
- org.eclipse.sisu.plexus-0.9.0.M3.jar
- maven-artifact-manager-2.2.1.jar
- maven-artifact-3.9.9.jar
- maven-repository-metadata-3.9.9.jar
- wagon-provider-api-3.5.3.jar
- maven-plugin-registry-2.2.1.jar
- plexus-container-default-1.0-alpha-9-stable-1.jar
- plexus-utils-3.5.1.jar
- plexus-classworlds-2.8.0.jar
- plexus-interpolation-1.27.jar
- commons-cli-1.8.0.jar
- plexus-component-annotations-2.1.0.jar
- httpclient-4.5.14.jar
- httpcore-4.4.16.jar
- commons-codec-1.16.0.jar
- reload4j-1.2.22.jar
- org.eclipse.sisu.inject-0.9.0.M3.jar
- aopalliance-1.0.jar
- plexus-xml-3.0.0.jar
- backport-util-concurrent-3.1.jar
- junit-3.8.1.jar
- classworlds-1.1-alpha-2.jar
################################################
> Task :help
Welcome to Gradle 8.5.
To run a build, run gradle <task> ...
To see a list of available tasks, run gradle tasks
To see more detail about a task, run gradle help --task <task>
To see a list of command-line options, run gradle --help
For more detail on using Gradle, see <https://docs.gradle.org/8.5/userguide/command_line_interface.html>
For troubleshooting, visit <https://help.gradle.org>
BUILD SUCCESSFUL in 9s
8 actionable tasks: 1 executed, 7 up-to-date
19:41:32: Execution finished 'help'.Steve Ebersole
10/30/2024, 6:43 PMgradlew generatePluginDescritor?Steve Ebersole
10/30/2024, 6:44 PMVampire
10/30/2024, 6:45 PMVampire
10/30/2024, 6:45 PMSteve Ebersole
10/30/2024, 6:45 PMSteve Ebersole
10/30/2024, 6:45 PMVampire
10/30/2024, 6:46 PMSteve Ebersole
10/30/2024, 6:46 PMVampire
10/30/2024, 6:46 PMTask 'generatePluginDescritor' not found in root project 'maven-plugin-testing' and its subprojects. Some candidates are: 'generatePluginDescriptor'.
Steve Ebersole
10/30/2024, 6:47 PMVampire
10/30/2024, 6:47 PMVampire
10/30/2024, 6:48 PMVampire
10/30/2024, 6:51 PMVampire
10/30/2024, 6:52 PMVampire
10/30/2024, 6:53 PMVampire
10/30/2024, 6:53 PMclose method of the service with implementing AutoCloseable, so that the classloader is only closed once the service is discarded.Vampire
10/30/2024, 6:53 PMVampire
10/30/2024, 6:54 PMSteve Ebersole
10/30/2024, 6:59 PMSteve Ebersole
10/30/2024, 7:00 PMSteve Ebersole
10/30/2024, 7:00 PMVampire
10/30/2024, 7:01 PMSteve Ebersole
10/30/2024, 7:10 PMVampire
10/30/2024, 7:11 PMSteve Ebersole
10/30/2024, 7:12 PMVampire
10/30/2024, 8:05 PMExecOperations#javaExec or similar.