使用Gradle for Java插件生成Java类

ata*_*ulm 15 java gradle

我想使用Gradle任务为Java项目生成一个Java类,类似于Android插件BuildConfig.java使用buildConfig <String>表示法创建的方式,例如:

android {
    ...

    buildTypes {
        final String PROVIDER_AUTHORITY_RELEASE = "public static final String PROVIDER_AUTHORITY = \"com.example.project.ContentProvider\";\n";
        final String PROVIDER_AUTHORITY_DEBUG = "public static final String PROVIDER_AUTHORITY = \"com.example.project.debug.ContentProvider\";\n";

        debug {
            ...
            buildConfig PROVIDER_AUTHORITY_DEBUG
        }

        release {
            ...
            buildConfig PROVIDER_AUTHORITY_RELEASE
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用例是我正在开发一个开源应用程序,它需要使用API​​密钥和秘密; 我有密钥和秘密gradle.properties没有承诺我的VCS.

到目前为止,我有这个:

task generateSources {
    outputDir = file("$buildDir/../src/main/java/uk/co/ataulm/mijur/core/api")
    outputs.dir outputDir
    doFirst {
        outputDir.exists() || outputDir.mkdirs()

        String API_CLIENT_ID = "public static final String API_CLIENT_ID = \"<your imgur uk.co.ataulm.mijur.core.api client id>\";\n"
        String API_CLIENT_SECRET = "public static final String API_CLIENT_SECRET = \"<your imgur uk.co.ataulm.mijur.core.api client secret>\";\n"

        try {
            API_CLIENT_ID = "public static final String API_CLIENT_ID = \"" + apiClientId + "\";\n"
            API_CLIENT_SECRET = "public static final String API_CLIENT_SECRET = \"" + apiClientSecret + "\";\n"
        } catch (Exception e) {
            println "gradle.properties not set with apiClientId and/or apiClientSecret. API calls will not work.";
        }

        new File(outputDir, "ApiConstants.java").write("package uk.co.ataulm.mijur.core.api;\n\npublic class ApiConstants {\n" + "    " + API_CLIENT_ID + "    " + API_CLIENT_SECRET + "}")
    }
}

compileJava.source generateSources.outputs.files, sourceSets.main.java
Run Code Online (Sandbox Code Playgroud)

它工作 - 它在指定的位置生成该文件.但它非常脆弱; 显式命名包容易出错.如果文件是在其他一些软件包中生成的,我会很高兴(例如,在其根目录下src/main/java),只要我可以使用Java访问它MyGeneratedFile.MyConstant.

欣赏任何想法(即使他们在不同的轨道上).

小智 15

我写了一个gradle插件,旨在为java/groovy项目的android tooling gradle插件提供一个构建配置:

https://github.com/mfuerstenau/gradle-buildconfig-plugin

它是每个源集,因为我需要一个特定的版本来显示依赖于两个不同源集的不同工件.

只需应用插件(gradle 2.1+)

plugins {
    'de.fuerstenau.buildconfig'
}

buildConfig {
   sourceSets {
      // this is a build config for "main" source set
      main {
         // if not defined, these are the defaults
         // packageName = project.group (not specified -> de.fuerstenau.buildconfig)
         // appName = project.name
         // version = project.version

         // custom fields con also be added
         // for example:
         // buildConfigField "String" "MYSTRING" "value"
      }
      // add more or other sourceSets like "main", be aware
      // of conflicts if you use
      // them combined
   }
}
Run Code Online (Sandbox Code Playgroud)

将导致一个类de.fuerstenau.buildconfig.BuildConfig(包可以配置如上):

package de.fuerstenau.buildconfig;

public final class BuildConfig
{
   private BuildConfig { }
   public final String VERSION = "<whatever-version-was-configured>";
   public final String NAME = "<whatever-appName-was-configured>";
}
Run Code Online (Sandbox Code Playgroud)

将创建并添加两个任务,一个用于生成类,另一个用于编译它,它们在"compileJava"-task之前执行,结果作为依赖项添加.


Pra*_*ala 6

更优雅的方法是编写一个 Gradle 插件。

task javaSourceGen(type: com.somecompany.gensrc.GenerateSouce) {
  //pass appropriate parameters
}
compileJava.dependsOn(javaSourceGen)
Run Code Online (Sandbox Code Playgroud)

然后在 Gradle 插件中,可以使用任何 Java 源生成器项目。

例如:https: //github.com/square/javapoethttp://codemodel.java.net/