Как исправить ClassNotFoundException org. apache .commons.code c .binary.Base64, даже если зависимость была добавлена? - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь зашифровать и расшифровать пароль из файла на IntelliJ во время работы над проектом Scala Sbt. Это мой scala класс:

import java.security.MessageDigest
import java.util

import javax.crypto.Cipher
import javax.crypto.spec.SecretKeySpec
import org.apache.commons.codec.binary.Base64

class DataEncrypt {

    def encrypt(key: String, value: String): String = {
        val cipher: Cipher = Cipher.getInstance("AES/ECB/PKCS5Padding")
        cipher.init(Cipher.ENCRYPT_MODE, keyToSpec(key))
        Base64.encodeBase64String(cipher.doFinal(value.getBytes("UTF-8")))
    }

    def decrypt(key: String, encryptedValue: String): String = {
        val cipher: Cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING")
        cipher.init(Cipher.DECRYPT_MODE, keyToSpec(key))
        new String(cipher.doFinal(Base64.decodeBase64(encryptedValue)))
    }

    def keyToSpec(key: String): SecretKeySpec = {
        var keyBytes: Array[Byte] = (SALT + key).getBytes("UTF-8")
        val sha: MessageDigest = MessageDigest.getInstance("SHA-1")
        keyBytes = sha.digest(keyBytes)
        keyBytes = util.Arrays.copyOf(keyBytes, 16)
        new SecretKeySpec(keyBytes, "AES")
    }

    private val SALT: String = "jMhKlOuJnM34G6NHkqo9V010GhLAqOpF0BePojHgh1HgNg8^72k"

}

Мой файл build.sbt:

name := "AnalyzeTables"

version := "0.1"

scalaVersion := "2.11.8"

// https://mvnrepository.com/artifact/org.postgresql/postgresql
libraryDependencies += "org.postgresql" % "postgresql" % "42.1.4"

// https://mvnrepository.com/artifact/commons-codec/commons-codec
libraryDependencies += "commons-codec" % "commons-codec" % "1.13"

// https://mvnrepository.com/artifact/org.apache.commons/commons-lang3
libraryDependencies += "org.apache.commons" % "commons-lang3" % "3.8.1"

Я создаю JAR-файл из проекта и выполняю его на cli, выполнив команду :

scala -cp /home/user/jars/postgresql-42.1.4.jar analyzetables_2.11-0.1.jar tablename

где analysistables_2.11-0.1.jar - это мой файл jar, а tablename - мой аргумент, который я читаю в коде. Если я отправляю код, я вижу исключение класса не найдено:

java.lang.ClassNotFoundException: org.apache.commons.codec.binary.Base64
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at com.enc.DataEncrypt.decrypt(DataEncrypt.scala:21)
    at com.db.manager.GpConnection.<init>(GpConnection.scala:13)
    at com.gp.analyze.GetStats.run_analyze(GetStats.scala:21)

Что именно происходит в: new String(cipher.doFinal(Base64.decodeBase64(encryptedValue))) Я пытался найти решения в Интернете для проблемы, с которой столкнулся, и большинство ответов добавляло банку файл: commons-codec к проекту, который у меня уже есть в файле build.sbt. У меня есть оператор импорта, а также попытался проверить, работает ли это:

new String(cipher.doFinal(org.apache.commons.codec.binary.Base64.decodeBase64(encryptedValue)))

Но все они дают classNotFoundException. Я также попытался создать толстую банку, выполнив:

project Structure->Artifacts-> + ->jars->from modules with dependencies and run the fat jar. 

В этом случае я вижу NullPointerException.

Структура моего проекта: enter image description here

Может ли кто-нибудь сообщить мне, если мне нужно изменить настройки или добавить отсутствующий файл jar?

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