我想使用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
}
}
}
用例是我正在开发一个需要使用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
并且它有效 - 它在指定位置生成该文件。但它非常脆弱;显式命名包容易出错。如果文件是在其他软件包中生成的(例如在src/main/java
的根目录下),我会很高兴,只要我可以使用MyGeneratedFile.MyConstant
在Java中访问它。
欣赏任何想法(即使它们落在不同的轨道上)。
答案 0 :(得分:14)
我写了一个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
}
}
将导致类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>";
}
将创建并添加两个任务,一个用于生成类,另一个用于编译它,它们在&#34; compileJava&#34; -task之前执行,结果作为依赖项添加。
答案 1 :(得分:3)
更优雅的方法是编写Gradle插件。
task javaSourceGen(type: com.somecompany.gensrc.GenerateSouce) {
//pass appropriate parameters
}
compileJava.dependsOn(javaSourceGen)
然后在Gradle插件中,可以使用Any Java Source生成器项目。
对于前:https://github.com/square/javapoet或 http://codemodel.java.net/