【问题标题】:How can I exclude a java file conditionally with the Spring Boot Gradle Plugin and bootJar task?如何使用 Spring Boot Gradle 插件和 bootJar 任务有条件地排除 java 文件?
【发布时间】:2018-08-31 06:30:39
【问题描述】:

我有一些代码我不想根据条件包含在 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
            }
        }
    }
}

现在,当我使用 gradlew clean build bootJar -Penvironment=prod 运行脚本时,除了危险的 java 文件之外,所有内容的绝对路径都会打印出来,但它们仍然包含在 jar 中。

如果我删除引导插件并运行jar 任务,危险的类文件仍然包含在 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 子句,则不会打印危险文件,并且它们不会包含在 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/**'
}

如果我启用引导插件,并使用 bootJar 任务(继承自 Jar 任务)(gradlew clean build bootJar -Penvironment=prod),我看不到打印的危险文件,但文件仍然包含在 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/**'
}

如何使用 Spring Boot Gradle 插件和 bootJar 任务有条件地排除 java 文件?

【问题讨论】:

    标签: java spring-boot gradle


    【解决方案1】:

    我在使用 2.0.1.RELEASE 时遇到了同样的问题。我使用 bootJar 选项创建了 jar。在其中添加要从可执行 jar 中排除的文件模式的排除。 这适用于 spring 2.0.4.RELEASE 版本。

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

    【讨论】:

      【解决方案2】:

      自己做jar,学gradle,别用那么多插件。而且……这个问题已经被正确回答了。我上周读过它,你一定是把它删了,然后复制了代码。不错的举动。

      【讨论】:

      • 这当然不是答案,也几乎不是评论。对我来说似乎更像是一种咆哮。我认为应该避免“不要那样做”的答案。您可能将此问题误认为的另一个问题是这个问题 (stackoverflow.com/questions/49330907/…),其中我询问了如何防止危险代码泄漏到产品构建中。我在这个问题上走上了两个答案的混合路径,并遇到了我在这个(不同的)问题中提到的这个问题。
      【解决方案3】:

      我缩小了问题的范围。我没有把上面所有的插件都放进去,因为我认为唯一重要的是java和spring boot。但是,我的实际代码也使用了protobuf 插件。如果我删除配置属性generatedFilesBaseDir,那么它会成功排除dangerous 目录。

      然而,这带来了一个新的问题,到底发生了什么?

      我指定了生成的文件基目录属性,因此我可以在我的源代码中引用生成的类,但我认为我可能需要为原型创建一个不同的项目,并将该项目添加为对我的 main 的引用模块。

      编辑

      为 protobuf 文件创建一个单独的项目并将其作为项目引用似乎是解决此问题的可行解决方法。

      【讨论】:

        猜你喜欢
        • 2020-06-18
        • 2020-10-14
        • 2015-03-15
        • 1970-01-01
        • 1970-01-01
        • 2019-10-05
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多