java - 在build.properties中调用类变量

标签 java gradle

我有点测试/纠正和旧的gradle项目,以使用无需手动执行即可自动将文件导入服务器的工具构建RPM。

但是,此工具需要该专有软件使用的文件,并且使用该文件确实知道需要使用哪些目录和库。这时需要生成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)
}

最佳答案

如果包含常量的类是您项目的一部分,则实现目标的一种方法是在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任务的自定义构建链,则必须调整以上代码段。

关于java - 在build.properties中调用类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55267506/

相关文章:

java - Android 连接到本地主机

java - java 计算排序算法的比较次数并将其添加到数组列表中

eclipse - 如何在Eclipse中使用Gradle

android - 私有(private) bitbucket maven repo

Java 包装器和原始内存分配

java - 库 java.util.Date 中用于日期比较的 equals 方法

java - 如何检查Android上的互联网访问? InetAddress 永远不会超时

svn - 无法在 Android Studio gradle 中导入 org.tmatesoft

gradle - 为什么 "gradle tasks"不显示任务?

android - 构建失败 : Program Type Already Present