在 IntelliJ Java 应用程序中构建变体(产品风格)

2022-09-02 14:14:47

是否有可能在IntelliJ中为传统的Java应用程序(不是Android项目)构建基于不同源代码集的变体?

我想使用Android gradle插件附带的productFlavors之类的功能,但对于传统的Java应用程序。

例:

library_red -- HelloImpl.java
library_blue -- HelloImpl.java
library_common -- Hello.java

compiled library_blue -- Hello.class, HelloImpl.class
compiled library_red -- Hello.class, HelloImpl.class

答案 1

答案是肯定的,但您将不得不使用新的Gradle软件模型,该模型非常孵化。这将是一条充满痛苦的道路,因为你将成为一个开拓者,正如我所学到的那样,它将用于C / Cpp项目。下面通常是生成的外观。

plugins {
    id 'jvm-component'
    id 'java-lang'
}

model {
  buildTypes {
    debug
    release
  }
  flavors {
    free
    paid
  }
    components {
        server(JvmLibrarySpec) {
            sources {
                java {
                  if (flavor == flavors.paid) {
                    // do something to your sources
                  }
                  if (builtType == buildTypes.debug) {
                    // do something for debuging
                  }
                    dependencies {
                        library 'core'
                    }
                }
            }
        }

        core(JvmLibrarySpec) {
            dependencies {
                library 'commons'
            }
        }

        commons(JvmLibrarySpec) {
            api {
                dependencies {
                    library 'collections'
                }
            }
        }

        collections(JvmLibrarySpec)
    }
}

参考资料: https://docs.gradle.org/current/userguide/java_software.html


答案 2

我们使用Gradle多模块项目作为我们的变体系统。有一个包含公共代码的核心项目。自定义操作只需在子项目中完成。

subprojects {
   dependencies {
     compile project(':core')
   }
}

变体子项目依赖于核心,每个子项目都构建单独的 .war 文件。请注意,在这种情况下,我们不会重写核心项目中的类。对于代码自定义,我们使用Spring,在某些情况下使用SPI,但我想任何依赖注入框架都可以实现这一点。它只是迫使你在核心中提供明确的扩展点,我认为这是一件好事。


推荐