Реализация пользовательской задачи Gradle: не удалось найти метод для аргументов - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть задача шифрования, которая получает входной файл и выходной файл вместе с ключом для шифрования.Странно то, что когда я пытаюсь извлечь метод, который выполняет шифрование строки и получает его в качестве аргумента, я получаю следующую ошибку: Could not find method encryptLine() for arguments [PK] on task ':presentation:encryptScenarios' of type EncryptionTask..Когда я включаю этот метод - он работает нормально.

Вот код встроенного варианта:

@TaskAction
void encryptFile() {
    assertThatEncryptionKeyIsPresent()
    createNewOutputFileIfNotExists()
    final FileOutputStream outputStream = new FileOutputStream(outputFile)
    inputFile.eachLine { String line ->
        final byte[] inputBytes = line.getBytes()
        final byte[] secretBytes = key.getBytes()
        final byte[] outputBytes = new byte[inputBytes.length]
        int spos = 0
        for (int pos = 0; pos < inputBytes.length; ++pos) {
            outputBytes[pos] = (byte) (inputBytes[pos] ^ secretBytes[spos])
            spos += 1
            if (spos >= secretBytes.length) {
                spos = 0
            }
        }
        outputStream.write(Base64.encodeBase64String(outputBytes).getBytes())
    }
}

А вот код извлеченного варианта метода:

@TaskAction
void encryptFile() {
    assertThatEncryptionKeyIsPresent()
    createNewOutputFileIfNotExists()
    final FileOutputStream outputStream = new FileOutputStream(outputFile)
    inputFile.eachLine { String line ->
        byte[] outputBytes = encryptLine(line)
        outputStream.write(Base64.encodeBase64String(outputBytes).getBytes())
    }
}

private byte[] encryptLine(String line) {
    final byte[] inputBytes = line.getBytes()
    final byte[] secretBytes = key.getBytes()
    final byte[] outputBytes = new byte[inputBytes.length]
    int spos = 0
    for (int pos = 0; pos < inputBytes.length; ++pos) {
        outputBytes[pos] = (byte) (inputBytes[pos] ^ secretBytes[spos])
        spos += 1
        if (spos >= secretBytes.length) {
            spos = 0
        }
    }
    outputBytes
}

Как решить эту проблему с помощью этого частного метода, который шифрует строку?

1 Ответ

0 голосов
/ 11 февраля 2019

Эта ошибка, похоже, связана с проблемой Groovy, на которую здесь ссылаются: https://issues.apache.org/jira/browse/GROOVY-7797

Вы пытаетесь вызвать закрытый метод из замыкания в том же классе, и похоже, что это не поддерживается.

Пожалуйста, попробуйте удалить модификатор private из определения метода encryptLine, и вы должны избавиться от этой ошибки.

...