From 0229ddf9e97bcc06c2f97d2b2706baed0ee2638e Mon Sep 17 00:00:00 2001 From: Steve Ebersole Date: Wed, 3 Sep 2025 17:54:53 -0600 Subject: [PATCH] HHH-19754 - Migrate XjcPlugin to using direct Java calls --- hibernate-core/hibernate-core.gradle | 6 +- local-build-plugins/build.gradle | 4 + .../org/hibernate/build/xjc/XjcPlugin.java | 51 -------- .../org/hibernate/build/xjc/XjcTask.groovy | 71 ----------- .../hibernate/build/xjc/SchemaDescriptor.java | 30 ++--- .../build/xjc/SchemaDescriptorFactory.java | 27 ++-- .../org/hibernate/build/xjc/XjcExtension.java | 29 ++--- .../hibernate/build/xjc/XjcListenerImpl.java | 61 +++++++++ .../org/hibernate/build/xjc/XjcPlugin.java | 22 ++++ .../java/org/hibernate/build/xjc/XjcTask.java | 118 ++++++++++++++++++ settings.gradle | 1 - 11 files changed, 245 insertions(+), 175 deletions(-) delete mode 100644 local-build-plugins/src/main/groovy/org/hibernate/build/xjc/XjcPlugin.java delete mode 100644 local-build-plugins/src/main/groovy/org/hibernate/build/xjc/XjcTask.groovy rename local-build-plugins/src/main/{groovy => java}/org/hibernate/build/xjc/SchemaDescriptor.java (68%) rename local-build-plugins/src/main/{groovy => java}/org/hibernate/build/xjc/SchemaDescriptorFactory.java (69%) rename local-build-plugins/src/main/{groovy => java}/org/hibernate/build/xjc/XjcExtension.java (65%) create mode 100644 local-build-plugins/src/main/java/org/hibernate/build/xjc/XjcListenerImpl.java create mode 100644 local-build-plugins/src/main/java/org/hibernate/build/xjc/XjcPlugin.java create mode 100644 local-build-plugins/src/main/java/org/hibernate/build/xjc/XjcTask.java diff --git a/hibernate-core/hibernate-core.gradle b/hibernate-core/hibernate-core.gradle index a417f71604bd..6aab566b22b8 100644 --- a/hibernate-core/hibernate-core.gradle +++ b/hibernate-core/hibernate-core.gradle @@ -112,17 +112,17 @@ xjc { hbm { xsdFile = file( 'src/main/resources/org/hibernate/xsd/mapping/legacy-mapping-4.0.xsd' ) xjcBindingFile = file( 'src/main/xjb/hbm-mapping-bindings.xjb' ) - xjcExtensions += ['inheritance', 'simplify'] + xjcPlugins('inheritance', 'simplify') } configuration { xsdFile = file( 'src/main/resources/org/hibernate/xsd/cfg/configuration-3.2.0.xsd' ) xjcBindingFile = file( 'src/main/xjb/configuration-bindings.xjb' ) - xjcExtensions += ['inheritance', 'simplify'] + xjcPlugins('inheritance', 'simplify') } mapping { xsdFile = file( 'src/main/resources/org/hibernate/xsd/mapping/mapping-7.0.xsd' ) xjcBindingFile = file( 'src/main/xjb/mapping-bindings.xjb' ) - xjcExtensions += ['inheritance', 'simplify'] + xjcPlugins('inheritance', 'simplify') } } } diff --git a/local-build-plugins/build.gradle b/local-build-plugins/build.gradle index dfa9f44d4ba6..19deebd1406b 100644 --- a/local-build-plugins/build.gradle +++ b/local-build-plugins/build.gradle @@ -21,6 +21,10 @@ dependencies { implementation "jakarta.inject:jakarta.inject-api:2.0.0" + implementation "org.glassfish.jaxb:jaxb-xjc:4.0.5" + implementation "org.patrodyne.jvnet:hisrc-basicjaxb-tools:2.2.1" + implementation "org.patrodyne.jvnet:hisrc-basicjaxb-plugins:2.2.1" + implementation 'io.smallrye:jandex:3.1.2' implementation 'org.apache.httpcomponents:httpclient:4.5.14' implementation 'jakarta.json.bind:jakarta.json.bind-api:2.0.0' diff --git a/local-build-plugins/src/main/groovy/org/hibernate/build/xjc/XjcPlugin.java b/local-build-plugins/src/main/groovy/org/hibernate/build/xjc/XjcPlugin.java deleted file mode 100644 index d726a85be0f5..000000000000 --- a/local-build-plugins/src/main/groovy/org/hibernate/build/xjc/XjcPlugin.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.build.xjc; - -import org.gradle.api.Plugin; -import org.gradle.api.Project; -import org.gradle.api.Task; -import org.gradle.api.artifacts.Configuration; -import org.gradle.api.artifacts.dsl.DependencyHandler; - -import java.util.LinkedHashMap; - -/** - * @author Steve Ebersole - */ -public class XjcPlugin implements Plugin { - public static final String XJC_BASIC_PLUGIN = "org.patrodyne.jvnet:hisrc-basicjaxb-plugins:2.2.1"; - public static final String XJC_BASIC_TOOLS = "org.patrodyne.jvnet:hisrc-basicjaxb-tools:2.2.1"; - public static final String XJC_BASIC_ANT = "org.patrodyne.jvnet:hisrc-basicjaxb-ant:2.2.1"; - - public static final String ANT_TASK_NAME = "org.jvnet.basicjaxb.xjc.XJC2Task"; - - @Override - public void apply(Project project) { - // Create the xjc grouping task - final Task groupingTask = project.getTasks().create( "xjc", xjcTask -> { - xjcTask.setGroup( "xjc" ); - xjcTask.setDescription( "Grouping task for executing one-or-more XJC compilations" ); - } ); - - // Create the Plugin extension object (for users to configure our execution). - project.getExtensions().create( "xjc", XjcExtension.class, groupingTask, project ); - - final DependencyHandler dependencyHandler = project.getDependencies(); - final Configuration antTaskDependencies = project.getConfigurations().detachedConfiguration( - dependencyHandler.create( XJC_BASIC_ANT ), - dependencyHandler.create( XJC_BASIC_PLUGIN ), - dependencyHandler.create( XJC_BASIC_TOOLS ), - dependencyHandler.gradleApi() - ); - - final LinkedHashMap map = new LinkedHashMap<>( 3 ); - map.put( "name", "xjc" ); - map.put( "classname", ANT_TASK_NAME ); - map.put( "classpath", antTaskDependencies.getAsPath() ); - project.getAnt().invokeMethod( "taskdef", new Object[] { map } ); - project.getAnt().setSaveStreams( false ); - } -} diff --git a/local-build-plugins/src/main/groovy/org/hibernate/build/xjc/XjcTask.groovy b/local-build-plugins/src/main/groovy/org/hibernate/build/xjc/XjcTask.groovy deleted file mode 100644 index 3335c546f957..000000000000 --- a/local-build-plugins/src/main/groovy/org/hibernate/build/xjc/XjcTask.groovy +++ /dev/null @@ -1,71 +0,0 @@ -package org.hibernate.build.xjc - -import org.gradle.api.DefaultTask -import org.gradle.api.file.DirectoryProperty -import org.gradle.api.file.RegularFileProperty -import org.gradle.api.provider.SetProperty -import org.gradle.api.tasks.* - -/** - * @author Steve Ebersole - */ -@CacheableTask -class XjcTask extends DefaultTask { - private final DirectoryProperty outputDirectory - - private final RegularFileProperty xsdFile - private final RegularFileProperty xjcBindingFile - private final SetProperty xjcExtensions - - XjcTask() { - xsdFile = project.getObjects().fileProperty() - xjcBindingFile = project.getObjects().fileProperty() - xjcExtensions = project.objects.setProperty( String.class ) - - outputDirectory = project.objects.directoryProperty() - } - - @InputFile - @PathSensitive( PathSensitivity.RELATIVE ) - RegularFileProperty getXsdFile() { - return xsdFile - } - - @InputFile - @PathSensitive( PathSensitivity.RELATIVE ) - RegularFileProperty getXjcBindingFile() { - return xjcBindingFile - } - - @Input - SetProperty getXjcExtensions() { - return xjcExtensions - } - - @OutputDirectory - DirectoryProperty getOutputDirectory() { - return outputDirectory - } - - @TaskAction - void generateJaxbBindings() { - project.delete( outputDirectory.get().asFileTree ) - - project.ant.xjc( - destdir: outputDirectory.get().asFile.absolutePath, - binding: xjcBindingFile.get().asFile.absolutePath, - schema: xsdFile.get().asFile.absolutePath, - extension: 'true') { - project.ant.arg line: '-no-header' - project.ant.arg line: '-npa' - - if ( xjcExtensions.isPresent() ) { - def extensionsToEnable = xjcExtensions.get() - if ( ! extensionsToEnable.isEmpty() ) { - def extensionsSwitches = extensionsToEnable.collect { "-X${it}" }.join( " " ) - project.ant.arg line: extensionsSwitches - } - } - } - } -} diff --git a/local-build-plugins/src/main/groovy/org/hibernate/build/xjc/SchemaDescriptor.java b/local-build-plugins/src/main/java/org/hibernate/build/xjc/SchemaDescriptor.java similarity index 68% rename from local-build-plugins/src/main/groovy/org/hibernate/build/xjc/SchemaDescriptor.java rename to local-build-plugins/src/main/java/org/hibernate/build/xjc/SchemaDescriptor.java index 5fd351f3914c..3ec4e77dcc16 100644 --- a/local-build-plugins/src/main/groovy/org/hibernate/build/xjc/SchemaDescriptor.java +++ b/local-build-plugins/src/main/java/org/hibernate/build/xjc/SchemaDescriptor.java @@ -11,11 +11,9 @@ import org.gradle.api.tasks.Input; import org.gradle.api.tasks.InputFile; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - /** + * Describes the XJC processing to apply for a single XSD + * * @author Steve Ebersole */ public class SchemaDescriptor implements Named { @@ -24,7 +22,7 @@ public class SchemaDescriptor implements Named { private final RegularFileProperty xsdFile; private final RegularFileProperty xjcBindingFile; - private final SetProperty xjcExtensions; + private final SetProperty xjcPlugins; public SchemaDescriptor(String name, Project project) { this.name = name; @@ -32,7 +30,7 @@ public SchemaDescriptor(String name, Project project) { xsdFile = project.getObjects().fileProperty(); xjcBindingFile = project.getObjects().fileProperty(); - xjcExtensions = project.getObjects().setProperty( String.class ); + xjcPlugins = project.getObjects().setProperty( String.class ); } @Override @@ -67,23 +65,11 @@ public void xjcBindingFile(Object reference) { } @Input - public SetProperty ___xjcExtensions() { - return xjcExtensions; - } - - public Set getXjcExtensions() { - return xjcExtensions.get(); - } - - public void setXjcExtensions(Set xjcExtensions) { - this.xjcExtensions.set( xjcExtensions ); - } - - public void setXjcExtensions(String... xjcExtensions) { - xjcExtensions( xjcExtensions ); + public SetProperty getXjcPlugins() { + return xjcPlugins; } - public void xjcExtensions(String... xjcExtensions) { - setXjcExtensions( new HashSet<>( Arrays.asList( xjcExtensions) ) ); + public void xjcPlugins(String... plugins) { + xjcPlugins.addAll( plugins ); } } diff --git a/local-build-plugins/src/main/groovy/org/hibernate/build/xjc/SchemaDescriptorFactory.java b/local-build-plugins/src/main/java/org/hibernate/build/xjc/SchemaDescriptorFactory.java similarity index 69% rename from local-build-plugins/src/main/groovy/org/hibernate/build/xjc/SchemaDescriptorFactory.java rename to local-build-plugins/src/main/java/org/hibernate/build/xjc/SchemaDescriptorFactory.java index 030c844eaaf2..69c3ec129f07 100644 --- a/local-build-plugins/src/main/groovy/org/hibernate/build/xjc/SchemaDescriptorFactory.java +++ b/local-build-plugins/src/main/java/org/hibernate/build/xjc/SchemaDescriptorFactory.java @@ -23,13 +23,13 @@ * @author Steve Ebersole */ public class SchemaDescriptorFactory implements NamedDomainObjectFactory { - private final XjcExtension xjcExtension; - private final Task groupingTask; + private final Provider baseOutputDirectory; + private final TaskProvider groupingTaskRef; private final Project project; - public SchemaDescriptorFactory(XjcExtension xjcExtension, Task groupingTask, Project project) { - this.xjcExtension = xjcExtension; - this.groupingTask = groupingTask; + public SchemaDescriptorFactory(Provider baseOutputDirectory, TaskProvider groupingTaskRef, Project project) { + this.baseOutputDirectory = baseOutputDirectory; + this.groupingTaskRef = groupingTaskRef; this.project = project; } @@ -38,7 +38,7 @@ public SchemaDescriptor create(String name) { final SchemaDescriptor schemaDescriptor = new SchemaDescriptor( name, project ); final String taskName = determineXjcTaskName( schemaDescriptor ); - final Provider taskOutputDirectory = xjcExtension.getOutputDirectory().dir( name ); + final Provider taskOutputDirectory = baseOutputDirectory.map( directory -> directory.dir( name ) ); // register the XjcTask for the schema final TaskProvider xjcTaskRef = project.getTasks().register( taskName, XjcTask.class, (task) -> { @@ -46,24 +46,25 @@ public SchemaDescriptor create(String name) { task.setDescription( "XJC generation for the " + name + " descriptor" ); // wire up the inputs and outputs - task.getXsdFile().set( schemaDescriptor.getXsdFile() ); - task.getXjcBindingFile().set( schemaDescriptor.getXjcBindingFile() ); - task.getXjcExtensions().set( schemaDescriptor.___xjcExtensions() ); - task.getOutputDirectory().set( taskOutputDirectory ); + task.getSchemaName().convention( name ); + task.getXsdFile().convention( schemaDescriptor.getXsdFile() ); + task.getXjcBindingFile().convention( schemaDescriptor.getXjcBindingFile() ); + task.getXjcPlugins().convention( schemaDescriptor.getXjcPlugins() ); + task.getOutputDirectory().convention( taskOutputDirectory ); } ); final SourceSetContainer sourceSets = project.getExtensions().getByType( SourceSetContainer.class ); final SourceSet mainSourceSet = sourceSets.getByName( MAIN_SOURCE_SET_NAME ); mainSourceSet.getJava().srcDir( xjcTaskRef ); - groupingTask.dependsOn( xjcTaskRef ); + groupingTaskRef.configure( (groupingTask) -> { + groupingTask.dependsOn( xjcTaskRef ); + } ); return schemaDescriptor; } private static String determineXjcTaskName(SchemaDescriptor schemaDescriptor) { - assert schemaDescriptor.getName() != null; - final char initialLetterCap = Character.toUpperCase( schemaDescriptor.getName().charAt( 0 ) ); final String rest = schemaDescriptor.getName().substring( 1 ); diff --git a/local-build-plugins/src/main/groovy/org/hibernate/build/xjc/XjcExtension.java b/local-build-plugins/src/main/java/org/hibernate/build/xjc/XjcExtension.java similarity index 65% rename from local-build-plugins/src/main/groovy/org/hibernate/build/xjc/XjcExtension.java rename to local-build-plugins/src/main/java/org/hibernate/build/xjc/XjcExtension.java index da8badfdc888..50906b59aa4e 100644 --- a/local-build-plugins/src/main/groovy/org/hibernate/build/xjc/XjcExtension.java +++ b/local-build-plugins/src/main/java/org/hibernate/build/xjc/XjcExtension.java @@ -10,39 +10,40 @@ import org.gradle.api.Project; import org.gradle.api.Task; import org.gradle.api.file.DirectoryProperty; -import org.gradle.api.provider.Property; -import org.gradle.api.tasks.OutputDirectory; +import org.gradle.api.tasks.TaskProvider; /** + * DSL extension for configuring XJC processing + * * @author Steve Ebersole */ public abstract class XjcExtension { private final DirectoryProperty outputDirectory; - private final Property jaxbBasicsVersion; private final NamedDomainObjectContainer schemas; @Inject - public XjcExtension(Task groupingTask, Project project) { + public XjcExtension(Project project) { + // Create the xjc grouping task + final TaskProvider groupingTaskRef = project.getTasks().register( "xjc", (groupingTask) -> { + groupingTask.setGroup( "xjc" ); + groupingTask.setDescription( "Grouping task for executing one-or-more XJC compilations" ); + } ); + outputDirectory = project.getObjects().directoryProperty(); outputDirectory.convention( project.getLayout().getBuildDirectory().dir( "generated/sources/xjc/main" ) ); - jaxbBasicsVersion = project.getObjects().property( String.class ); - jaxbBasicsVersion.convention( "2.2.1" ); - - // Create a dynamic container for SchemaDescriptor definitions by the user. + // create a dynamic container for SchemaDescriptor definitions by the user // - for each schema they define, create a Task to perform the "compilation" - schemas = project.container( SchemaDescriptor.class, new SchemaDescriptorFactory( this, groupingTask, project ) ); + schemas = project.container( + SchemaDescriptor.class, + new SchemaDescriptorFactory( outputDirectory, groupingTaskRef, project ) + ); } - @OutputDirectory public DirectoryProperty getOutputDirectory() { return outputDirectory; } - public Property getJaxbBasicsVersion() { - return jaxbBasicsVersion; - } - @SuppressWarnings("unused") public final NamedDomainObjectContainer getSchemas() { return schemas; diff --git a/local-build-plugins/src/main/java/org/hibernate/build/xjc/XjcListenerImpl.java b/local-build-plugins/src/main/java/org/hibernate/build/xjc/XjcListenerImpl.java new file mode 100644 index 000000000000..6c6a94f38385 --- /dev/null +++ b/local-build-plugins/src/main/java/org/hibernate/build/xjc/XjcListenerImpl.java @@ -0,0 +1,61 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.build.xjc; + +import com.sun.tools.xjc.XJCListener; +import org.gradle.api.Project; +import org.xml.sax.SAXParseException; + +/** + * Event listener for the XJC process. + * + * @author Steve Ebersole + */ +public class XjcListenerImpl extends XJCListener { + private final String schemaName; + private final Project project; + private boolean hadErrors; + + public XjcListenerImpl(String schemaName, Project project) { + this.schemaName = schemaName; + this.project = project; + } + + public boolean hadErrors() { + return hadErrors; + } + + @Override + public void generatedFile(String fileName, int current, int total) { + project.getLogger().info( "XJC generated file ({}) : {}", schemaName, fileName ); + } + + @Override + public void message(String msg) { + project.getLogger().info( "XJC message ({}) : {}", schemaName, msg ); + } + + @Override + public void info(SAXParseException exception) { + project.getLogger().info( "XJC info ({})", schemaName, exception ); + } + + @Override + public void warning(SAXParseException exception) { + project.getLogger().warn( "XJC warning ({})",schemaName, exception ); + } + + @Override + public void error(SAXParseException exception) { + hadErrors = true; + project.getLogger().error( "XJC error ({})", schemaName, exception ); + } + + @Override + public void fatalError(SAXParseException exception) { + hadErrors = true; + project.getLogger().error( "XJC fatal error ({})", schemaName, exception ); + } +} diff --git a/local-build-plugins/src/main/java/org/hibernate/build/xjc/XjcPlugin.java b/local-build-plugins/src/main/java/org/hibernate/build/xjc/XjcPlugin.java new file mode 100644 index 000000000000..660e37d8edd9 --- /dev/null +++ b/local-build-plugins/src/main/java/org/hibernate/build/xjc/XjcPlugin.java @@ -0,0 +1,22 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.build.xjc; + +import org.gradle.api.Plugin; +import org.gradle.api.Project; + + +/** + * Plugin for executing the XJC process as part of the build. + * + * @author Steve Ebersole + */ +public class XjcPlugin implements Plugin { + @Override + public void apply(Project project) { + // Create the Plugin extension object (for users to configure our execution). + project.getExtensions().create( "xjc", XjcExtension.class, project ); + } +} diff --git a/local-build-plugins/src/main/java/org/hibernate/build/xjc/XjcTask.java b/local-build-plugins/src/main/java/org/hibernate/build/xjc/XjcTask.java new file mode 100644 index 000000000000..de38970a8d47 --- /dev/null +++ b/local-build-plugins/src/main/java/org/hibernate/build/xjc/XjcTask.java @@ -0,0 +1,118 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.build.xjc; + +import com.sun.tools.xjc.BadCommandLineException; +import com.sun.tools.xjc.Driver; +import org.gradle.api.DefaultTask; +import org.gradle.api.file.DirectoryProperty; +import org.gradle.api.file.RegularFileProperty; +import org.gradle.api.provider.Property; +import org.gradle.api.provider.SetProperty; +import org.gradle.api.tasks.CacheableTask; +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.InputFile; +import org.gradle.api.tasks.Internal; +import org.gradle.api.tasks.OutputDirectory; +import org.gradle.api.tasks.PathSensitive; +import org.gradle.api.tasks.PathSensitivity; +import org.gradle.api.tasks.TaskAction; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Set; + +/** + * Task to perform the XJC processing using {@linkplain Driver} + * + * @author Steve Ebersole + */ +@CacheableTask +public class XjcTask extends DefaultTask { + private final Property schemaName; + private final DirectoryProperty outputDirectory; + private final RegularFileProperty xsdFile; + private final RegularFileProperty xjcBindingFile; + private final SetProperty xjcPlugins; + + public XjcTask() { + schemaName = getProject().getObjects().property( String.class ); + + xsdFile = getProject().getObjects().fileProperty(); + xjcBindingFile = getProject().getObjects().fileProperty(); + xjcPlugins = getProject().getObjects().setProperty( String.class ); + + outputDirectory = getProject().getObjects().directoryProperty(); + + schemaName.convention( xsdFile.map( regularFile -> regularFile.getAsFile().getName() ) ); + } + + @Internal + public Property getSchemaName() { + return schemaName; + } + + @InputFile + @PathSensitive(PathSensitivity.RELATIVE) + public RegularFileProperty getXsdFile() { + return xsdFile; + } + + @InputFile + @PathSensitive(PathSensitivity.RELATIVE) + public RegularFileProperty getXjcBindingFile() { + return xjcBindingFile; + } + + @Input + public SetProperty getXjcPlugins() { + return xjcPlugins; + } + + @OutputDirectory + public DirectoryProperty getOutputDirectory() { + return outputDirectory; + } + + @TaskAction + public void generateJaxbBindings() { + getProject().delete( outputDirectory.get().getAsFileTree() ); + + final XjcListenerImpl listener = new XjcListenerImpl( schemaName.get(), getProject() ); + final String[] args = buildXjcArgs(); + + try { + Driver.run( args, listener ); + } + catch (BadCommandLineException e) { + throw new RuntimeException( "Error running XJC process", e ); + } + } + + private String[] buildXjcArgs() { + final ArrayList argsList = new ArrayList<>(); + + Collections.addAll( argsList, "-d", outputDirectory.get().getAsFile().getAbsolutePath() ); + Collections.addAll( argsList, "-b", xjcBindingFile.get().getAsFile().getAbsolutePath()); + + argsList.add( "-extension" ); + argsList.add( "-no-header" ); + argsList.add( "-npa" ); + + if ( xjcPlugins.isPresent() ) { + final Set xjcPluginsToEnable = xjcPlugins.get(); + if ( !xjcPluginsToEnable.isEmpty() ) { + xjcPluginsToEnable.forEach( (ext) -> { + argsList.add( "-X" + ext ); + } ); + } + } + + argsList.add( xsdFile.get().getAsFile().getAbsolutePath() ); + + return argsList.toArray( new String[0] ); + } + +} diff --git a/settings.gradle b/settings.gradle index 1439c851d559..0445b5925eff 100644 --- a/settings.gradle +++ b/settings.gradle @@ -165,7 +165,6 @@ dependencyResolutionManagement { library( "inject", "jakarta.inject", "jakarta.inject-api" ).versionRef( injectVersion ) library( "jaxbApi", "jakarta.xml.bind", "jakarta.xml.bind-api" ).versionRef( jaxbApiVersion ) library( "jaxb", "org.glassfish.jaxb", "jaxb-runtime" ).versionRef( jaxbRuntimeVersion ) - library( "xjc", "org.glassfish.jaxb", "jaxb-xjc" ).versionRef( xjcVersion ) } testLibs { def junit5Version = version "junit5", "5.13.4"