使用Gradle for Java插件生成Java类
我想使用Gradle任务为Java项目生成一个Java类,类似于Android插件使用buildConfig
表示法创建BuildConfig.java
的方式,例如:
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 = \"\";\n" String API_CLIENT_SECRET = "public static final String 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中访问它。
欣赏任何想法(即使他们在不同的轨道上)。
更优雅的方法是编写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/
我写了一个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 = ""; public final String NAME = ""; }
将创建并添加两个任务,一个用于生成类,另一个用于编译它,它们在“compileJava”-task之前执行,结果作为依赖项添加。
- gradle存储库指向具有多个库的本地目录
- Spring引导Hibernate错误java.lang.NoSuchMethodError:javax.persistence.JoinColumn.foreignKey()Ljavax / persistence / ForeignKey;
- Gradle:战争任务有冲突包含/排除
- 运行jacocoReport
- 使用Gradle编译项目时,IntelliJ究竟在做什么?
- Gradle Multiproject Build:如何在不创建伪项目的情况下将WAR项目的JAR包含到另一个WAR中
- Gradle多模块项目设置
- Jacoco离线仪器Gradle脚本
- 无法使用Parse运行应用程序