[ 
https://issues.apache.org/jira/browse/TOMEE-2152?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16276839#comment-16276839
 ] 

Jens Berke commented on TOMEE-2152:
-----------------------------------

Hi, Romain. Yes, I actually had to switch from @Default to @Jars to make it 
work at all with Gradle (latest Version 4.3.1), but @Jars has a similar problem 
as @Default. It currently works with a workaround but will break with Gradle 5. 
Some details:

I have a Gradle multi build project, where "model" and "webapp" are subprojects 
(with each subproject having its own Gradle output directory structure):

{noformat}
rootProject
 |- model
 |- webapp
{noformat}

The application composer in "webapp" is configured like this and is used with a 
SingleApplicationComposerRunner:

{code:java}
@Application
@Classes(cdi = true)
@Jars(value = {
        "model", "webapp"
})
public class WebappTestDescriptor
{code}

I have to include the "webapp" subproject in @Jars because @Default doesn't 
work with Gradle >= 4. If I didn't include "webapp" in @Jars, the unit tests 
would fail for the "webapp" subproject because its test classes are not found. 
Including "webapp" in @Jars on the other hand will add it's output directories 
to the classpath, not its jar.  Therefore, "ApplicationComposers.findFiles" 
will look for the Maven-like directory structure "target/classes", which it 
doesn't find because of Gradle's different default output directory layout. To 
make it work I had to change the output directories in my Gradle build script 
like this:

{code}
sourceSets {
    main {
        output.classesDir = 
"${project.buildDir}/main/${project.name}/target/classes"
        output.resourcesDir = 
"${project.buildDir}/main/${project.name}/target/classes"
        }
    test {
        output.classesDir = 
"${project.buildDir}/test/${project.name}/target/classes"
        output.resourcesDir = 
"${project.buildDir}/test/${project.name}/target/classes"
    }
}
{code}

This workaround will stop working in Gradle 5 because being able to change the 
"output" folder is scheduled to be removed in version 5. Then neither @Default 
nor @Jars will work with Gradle.

> ApplicationComposers @Default fails to detect main classes for Gradle >= 4
> --------------------------------------------------------------------------
>
>                 Key: TOMEE-2152
>                 URL: https://issues.apache.org/jira/browse/TOMEE-2152
>             Project: TomEE
>          Issue Type: Bug
>    Affects Versions: 7.0.4
>            Reporter: Jens Berke
>         Attachments: ApplicationComposers.patch
>
>
> Starting with Gradle 4, the output directory layout has been changed, and as 
> a result the detection of the main classes directory in 
> org.apache.openejb.testing.ApplicationComposers.addWebApp fails.
> The changes are documented in the  [release notes for Gradle 
> 4|https://docs.gradle.org/4.0/release-notes.html], see chapters "Multiple 
> class directories for a single source set" and "Location of classes in the 
> build directory" there.
> As a workaround it is currently possible to change the output directory 
> structure in the Gradle build script to what ApplicationComposers.addWebApp 
> expects, but this possibility is scheduled to be removed in Gradle 5.0.
> The attached patch only demonstrates the minimal change necessary for Gradle 
> >= 4, but it also breaks backwards compatibility with Gradle <= 3. Therefore 
> it might be a good idea to add a system property or something similar which 
> allows activation of the old directory structure detection for Gradle <= 3. 
> It also may be a good idea to not hard-code the "java" sub-directory because 
> the value might be different depending on the plugins used to run and build 
> in Gradle. See the Gradle API doc for 
> [SourceDirectorySet.outputdir|https://docs.gradle.org/4.0/dsl/org.gradle.api.file.SourceDirectorySet.html]
>  which shows how Gradle now creates the output path dynamically.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to