Вызов переменной класса в build.properties - PullRequest
0 голосов
/ 20 марта 2019

Я вроде как тестирую / исправляю старый проект 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)
}

1 Ответ

0 голосов
/ 21 марта 2019

Если класс, содержащий константы, является частью вашего проекта, одним из способов достижения вашей цели будет динамическая загрузка выходного фляги в вашей задаче создания RPM, а затем извлечение нужных значений с помощью отражения:

// 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...