在build.properties

时间:2019-03-20 18:07:26

标签: java gradle

我有点测试/更正和古老的gradle项目,目的是使用一种无​​需手动执行即可自动将文件导入服务器的工具来构建RPM。

但是,此工具需要该专有软件使用的文件,并且使用该文件时,它确实知道需要使用哪些dirs和libs。这时需要生成RPM并用手将文件复制到该工具的bin文件夹中,我想将该文件合并到RPM中而不将文件的完整路径传递给该文件,因为该软件可以被任何人和目录使用因为该软件可能因环境而异。

在所有类中声明了以下变量:

private static final String DB_USER          = "db_user";
private static final String DB_PASSWORD      = "db_password";
private static final String DB_URL           = "db_url";
private static final String W_HOME           = "w_home";
private static final String W_LOGIN          = "w_login";
private static final String W_LOGIN_USERNAME = "username";
private static final String W_LOGIN_PASSWORD = "password";
private static final String W_SERVER_URL     = "w_server_url";

w_home是用于读取软件安装位置的路径,通过在build.gradle中使用该变量,我可以轻松地传递文件夹和文件名并将其放入RPM软件包中。

我的问题是,是否有可能调用java变量或将该变量获取到build.gradle

编辑:添加gradle任务

task buildRpm(type: Rpm, overwrite: true, dependsOn: build) {
    packageName = applicationName
    release = rpm_release
    arch = NOARCH
    os = LINUX
    epoch = git.head().time
    summary = "Import"
    license = 'Proprietary'

    user User
    permissionGroup Group

    //THIS DIRECTORY SHOULD ALREADY BE PRESENT
    into(Home){
        addParentDirs = false
        fileMode 0644
        dirMode 0755

        directory("${Home}/${ packageName }")
        directory("${Home}/${ packageName }/lib")
        directory("${Home}/${ packageName }/config")
        directory("${Home}/${ packageName }/bin")
        directory("${Home}/${ packageName }/logs", 0777)

        from(jar.outputs.files) {
            into "${ packageName }/lib"
        }

        from(configurations.runtime) {
            into "${ packageName }/lib"
        }

        from('lib') {
            into "${ packageName }/lib"
        }

        from('src/dist/config') {
            exclude 'log4j2.xml'
            into "${ packageName }/config"
        }

        from('src/dist/config/log4j2.xml') {
            into "${ packageName }/config"
            fileType CONFIG | NOREPLACE
        }

        from('out/scripts') {
            into "${ packageName }/bin"
            fileMode 0755
        }
    }
    requires('java', '2000:1.8.0_121', GREATER | EQUAL)
}

1 个答案:

答案 0 :(得分:0)

如果包含常量的类是您项目的一部分,则实现目标的一种方法是在RPM生成任务中动态加载输出jar,然后通过反射提取所需的值:

// Put this in your RPM task
URL[] urls = [new URL("file:///" + jar.archivePath.absolutePath)]
def loader = new URLClassLoader(urls)
// className is the fully qualified name of the configuration class
Class<?> clazz = loader.loadClass(className)

def field = clazz.getDeclaredField("W_HOME")
field.setAccessible(true) // This is needed for private fields
String home = field.get(null)

由于您的类具有显然打算在外部使用的常量,因此使它们private毫无意义。

当然,如果您有一些不使用标准jar任务的自定义构建链,则必须调整以上代码段。