Zymus
Zymus

Reputation: 1698

How can I exclude a java file conditionally with the Spring Boot Gradle Plugin and bootJar task?

I have some code that I do not want included in the jar file based on a condition.

My build script looks like

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.0.0.RELEASE'
}

sourceSets {
    main {
        java {
            if (project.environment == 'prod') {
                exclude '**/dangerous/**'
            }
            forEach {
                println it.absolutePath
            }
        }
    }
}

Now, when I run the script with gradlew clean build bootJar -Penvironment=prod the absolute paths of everything but the dangerous java files is printed, but they are still included in the jar.

If I remove the boot plugin and run the jar task, the dangerous class files are still included in the jar.

gradlew clean build jar -Penvironment=prod

plugins {
    id 'java'
}

sourceSets {
    main {
        java {
            if (project.environment == 'prod') {
                exclude '**/dangerous/**'
            }
            forEach {
                println it.absolutePath
            }
        }
    }
}

If I add an exclude clause to the jar task, the dangerous files are not printed, and they are not included in the jar.

gradlew clean build jar -Penvironment=prod

plugins {
    id 'java'
}

sourceSets {
    main {
        java {
            if (project.environment == 'prod') {
                exclude '**/dangerous/**'
            }
            forEach {
                println it.absolutePath
            }
        }
    }
}

jar {
    exclude '**/dangerous/**'
}

If I enable the boot plugin, and use the bootJar task (which inherits from the Jar task) (gradlew clean build bootJar -Penvironment=prod), I do not see the dangerous files printed, but the files are still included in the jar.

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.0.0.RELEASE'
}

sourceSets {
    main {
        java {
            if (project.environment == 'prod') {
                exclude '**/dangerous/**'
            }
            forEach {
                println it.absolutePath
            }
        }
    }
}

bootJar {
    exclude '**/dangerous/**'
}

How can I exclude a java file conditionally with the Spring Boot Gradle Plugin and bootJar task?

Upvotes: 3

Views: 3865

Answers (2)

Aditi
Aditi

Reputation: 986

I was having same issue when i was using 2.0.1.RELEASE. I created jar using bootJar option. Add exclude inside it with file patterns which you want to exclude from executable jar. This worked fine with spring 2.0.4.RELEASE version.

bootJar {
    exclude("**/dangerous/*")
}

Upvotes: 2

Zymus
Zymus

Reputation: 1698

I narrowed down the problem. I didn't put in all of the plugins up above, because I thought the only important ones were java and spring boot. However, my actual code also uses the protobuf plugin. If I remove the configuration property generatedFilesBaseDir, then it successfully excludes the dangerous directory.

However, this opens up a new question of, what the hell is happening?

I was specifying the generated files base dir property so I could reference the generated classes in my source code, but I think I may need to create a different project just for the proto, and add that project as a reference to my main module.

Edit

Making a separate project for the protobuf files and referencing it as a project seems to be a viable workaround for this issue.

Upvotes: 0

Related Questions