我有点测试/更正和古老的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)
}
答案 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
任务的自定义构建链,则必须调整以上代码段。