使用Gradle for Java插件生成一个Java类 [英] Generate a Java class using Gradle for Java plugin

查看:180
本文介绍了使用Gradle for Java插件生成一个Java类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  android {
...

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

debug {
...
buildConfig PROVIDER_AUTHORITY_DEBUG
}

版本{
...
buildConfig PROVIDER_AUTHORITY_RELEASE
}
}
}

用例是我正在开发一个需要使用API​​密钥和秘密的开源应用程序;我在 gradle.properties 中有个关键和秘密,它没有被提交给我的VCS。



到目前为止,我有这个:

$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $' 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 = \<您的imgur uk.co.ataulm.mijur.core.api客户端ID> \; \ n
字符串API_CLIENT_SECRET =公共静态最终字符串API_CLIENT_SECRET = \<您的imgur uk.co.ataulm.mijur.core.api客户端密钥> \; \\\


try {
API_CLIENT_ID =public static final String API_CLIENT_ID = \+ apiClientId +\; \\\

API_CLIENT_SECRET =public static final String API_CLIENT_SECRET = \ + apiClientSecret +\; \\\

} catch(Exception e){
printlngradle.properties没有用apiClientId和/或apiClientSecret设置,API调用不起作用。
}

新文件(outputDir,ApiConstants.java)。write(package uk.co.ataulm.mijur.core.api; \\\
\\\
public class ApiConstants { \\\
++ API_CLIENT_ID ++ API_CLIENT_SECRET +})
}
}

compileJava.source generateSources.outputs.files,sourceSets.main。 java

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



欣赏任何创意(即使它们在不同的轨道上)。

解决方案

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

 任务javaSourceGen(类型:com.somecompany.gensrc.GenerateSouce){
//传递适当的参数
}
compileJava.dependsOn(javaSourceGen)

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



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


I'd like to generate a Java class using a Gradle task for a Java project, similar to how the Android plugin creates BuildConfig.java using the buildConfig <String> notation, e.g.:

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
        }
    }
}

The use case is that I'm developing an open source app which requires the use of an API key and secret; I have the key and secret in gradle.properties which isn't committed to my VCS.

So far, I have this:

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

and it works - it generates that file at the specified location. But it's very fragile; explicitly naming the package is prone to error. I'd be happy if the file is generated in some other package (e.g. at the root of the src/main/java) as long as I can access it in Java, using MyGeneratedFile.MyConstant.

Appreciate any ideas (even if they are down a different track).

解决方案

More elegant approach is to write a Gradle Plugin.

task javaSourceGen(type: com.somecompany.gensrc.GenerateSouce) {
  //pass appropriate parameters
}
compileJava.dependsOn(javaSourceGen)

Then in the Gradle Plugin, Any Java Source generator project can be used.

For ex: https://github.com/square/javapoet or http://codemodel.java.net/

这篇关于使用Gradle for Java插件生成一个Java类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆