1
votes

I am trying to assemble an ear with Gradle, wich application.xml contains some non-ejb modules. The dependent project archives are generated with the {basename}-{version}.{extension} standard and thus look something like, e.g. subproject-0.2.6.rar. However, since some of these projects need to be marked as java or connector module, I have issues addressing the correct files.

This is what the build script looks like:

apply plugin: 'ear'

dependencies {
    deploy project(':EJB-Project')
    deploy project(':Commons')
    deploy project(':UpdateManager')

    earlib 'net.sf:jasperreports:unknown'
    earlib 'org.apache.axis:axis:1.4'
}

ear {
    deploymentDescriptor {
        applicationName = 'EnterpriseProject'

        module('Commons.jar', 'java')
        module('UpdateManager.rar', 'connector')
    }

    // Remove the version postfix from archived files
    rename(/(.*)-${version}(.)/, /$1$2/)
}

The jboss-deployment-structure.xml has the archives in the sub-deployment nodes declared without the version specifier, too.

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
       ...
    <sub-deployment name="EJB-Project.jar">
        <dependencies />
        <exclusions />
    </sub-deployment>
    <sub-deployment name="Commons.jar">
        <dependencies />
        <exclusions />
    </sub-deployment>
        ...

The rename method in the ear task successfully renames the libraries from the deploy configuration, but Gradle adds the dependencies, which are not explicitly added via module(String path, String identifier) automatically with their original name as ejb module:

<module>
    <ejb>EJB-Project-4.5.2.jar</ejb>
</module>

I would love to solve this in a clean way - e.g., referencing the project itself in the module section, rather than specifying the file name (and its extension) and generating the deployment xml for JBoss, but I'm somehow stuck. I want all version strings to be removed, or keep all of them.

2

2 Answers

0
votes

I solved something similar like this in gradle 6.8:

I started from here:

plugins {
    id 'ear'
}

dependencies {
    deploy      'org.cpp.pp:dmReports:5.04.01-2'
    deploy      project(':reporting-transpoLib')
}

ear {
    deploymentDescriptor {
        module('dmReports-5.04.01-2.jar', 'java')
        module("reporting-transpoLib-${project.version}.jar", 'java')
    }
}

which produced an ear containing jars with versions and deployment descriptor with versions.

But I had also a second war specifying in it's deployment descriptor a dependency to dmReports.

For each new version of dmReports, deployed via this ear, I had to updated also the war deployment descriptor (dependency section)- which was not ok.

I needed to remove the dmReports version from the ear and from war deployment descriptor.

So I changed to this the ear:

plugins {
    id 'ear'
}

configurations {
    dmReports
    reportingTranspoLib
}

dependencies {
    dmReports          'org.cpp.pp:dmReports:5.04.01-2'
    reportingTranspoLib project(':reporting-transpoLib')
}

// copyToLib task copies the dependencies and rename them (remove version) in a separate 
// folder: ${buildDir}/lib. This folder will be used as input for deploy configuration

task copyToLib {
    dependsOn(':reporting-transpoLib:build')

    doFirst {
        def  configNames = [ 'dmReports', 'reportingTranspoLib']
        configNames.each { configName ->
            configurations.getByName(configName).resolvedConfiguration.resolvedArtifacts.each { artifact ->
                project.copy {
                    from artifact.file
                    into "${buildDir}/lib"
                    rename { "${artifact.name}.${artifact.extension}" }
                }
            }
        }
    }
}

// the output of copyToLib task (folder ${buildDir/lib}) is taken and used by configuration deploy

dependencies {
    deploy files("${buildDir}/lib")
}


ear {
    dependsOn(copyToLib)
//    from(copyToLib)
    deploymentDescriptor {
        module('dmReports.jar', 'java')
        module("reporting-transpoLib.jar", 'java')
    }
}

So I obtained an ear containing jars without versions and deployment descriptor without versions. Was very usefull.

0
votes

There is a plugin, that generates the JBoss Deployment Structure on GitHub. Since I found no clean way of solving this somehow else, I just implemented the features I was missing on the plugin and the owner merged them.