java.lang.NoClassDefFoundError: org/apache/commons/codec/binary/Base64

Админ, пожалуйста, не отмечайте это как дубликат, прочитайте мой вопрос полностью. Я шифрую и расшифровываю некоторый текст, но при работе в одном файле с основным он работает нормально, но когда я вызываю его функцию шифрования и расшифровки извне. Выдает ошибку во время выполнения. Прилагаю код. пакет desede;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

import security.SHA256Algo;
import shradhafinalwiddesign.UpdateFile;
import shradhafinalwiddesign.UserRegistration;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * Simple TripleDES Encrypt/Decrypt Test 
 * sha1, utf-8, no padding
 *
 * uses commons-codec-1.6 
 * javac -cp :commons-codec-1.6.jar TripleDESTest.java
 * java -cp :commons-codec-1.6.jar TripleDESTest 
 */

public class TripleDesDemo {


    public static void main(String[] args) throws Exception {

        String text = "textToEncrypt";
        UserRegistration user = new UserRegistration() ;
        user.setlUsername("tarunv") ;
        user.setAnswer("tommysdsfdsfsd") ;
        user.setLastaccess("pets namesdfsfds") ;
        user.setLpassword("computersdfdsfd") ;

        String h1 = SHA256Algo.createHash(user.getlUsername()) ;
        String h2 = SHA256Algo.createHash(user.getLpassword()) ;
        String h3 = SHA256Algo.createHash(user.getAnswer()) ;

        String hash1 = UpdateFile.modifyHashValue(h1).substring(0, 24) ;
        String hash2 = UpdateFile.modifyHashValue(h2) ;
        String hash3 = UpdateFile.modifyHashValue(h3) ;

        System.out.println("    key1 : "+hash1.length()+"    key2 : "+hash2.length()+"   key3 : "+hash3.length());
        byte[] arr = toByteArray(user) ;

        byte[] codedtext = TripleDesDemo._encrypt(arr,"[email protected]");
        byte[] codedtext1 = TripleDesDemo._encrypt(codedtext,"[email protected]");
        byte[] codedtext2 = TripleDesDemo._encrypt(codedtext1,"[email protected]");

        writeSmallBinaryFile(codedtext2, "tarun.bat") ;
        byte[] texttoDecrypt = readSmallBinaryFile("tarun.bat");

        byte[] decodedtext = TripleDesDemo._decrypt(texttoDecrypt,"[email protected]");
        byte[] decodedtext1 = TripleDesDemo._decrypt(decodedtext,"[email protected]");
        byte[] decodedtext2 = TripleDesDemo._decrypt(decodedtext1,"[email protected]");

        System.out.println(codedtext + " ---> " + toObject(decodedtext2));

      }


    public static byte[] _encrypt(byte[] plainTextBytes, String secretKey) throws Exception {

        byte[] keyBytes = secretKey.getBytes();

        SecretKey key = new SecretKeySpec(keyBytes, "DESede");
        Cipher cipher = Cipher.getInstance("DESede");
        cipher.init(Cipher.ENCRYPT_MODE, key);

        //byte[] plainTextBytes = message.getBytes("utf-8");
        byte[] buf = cipher.doFinal(plainTextBytes);
        byte [] base64Bytes = Base64.encodeBase64(buf);
        //String base64EncryptedString = new String(base64Bytes);

        return base64Bytes ;
    }

    public static byte[] _decrypt(byte[] encryptedText, String secretKey) throws Exception {

        //byte[] message = Base64.decodeBase64(encryptedText);
        byte[] message = Base64.decodeBase64(encryptedText);
        byte[] keyBytes = secretKey.getBytes();
        SecretKey key = new SecretKeySpec(keyBytes, "DESede");

        Cipher decipher = Cipher.getInstance("DESede");
        decipher.init(Cipher.DECRYPT_MODE, key);

        byte[] plainText = decipher.doFinal(message);
        return plainText ;
        //return toObject(plainText);
    }

    public static byte[] toByteArray(UserRegistration obj) throws IOException {
        byte[] bytes = null;
        ByteArrayOutputStream bos = null;
        ObjectOutputStream oos = null;
        try {
            bos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(bos);
            oos.writeObject(obj);
            oos.flush();
            bytes = bos.toByteArray();
        } finally {
            if (oos != null) {
                oos.close();
            }
            if (bos != null) {
                bos.close();
            }
        }
        return bytes;
    }

    public static UserRegistration toObject(byte[] bytes) throws IOException, ClassNotFoundException {
        UserRegistration obj = null;
        ByteArrayInputStream bis = null;
        ObjectInputStream ois = null;
        try {
            bis = new ByteArrayInputStream(bytes);
            ois = new ObjectInputStream(bis);
            obj = (UserRegistration) ois.readObject();
        } finally {
            if (bis != null) {
                bis.close();
            }
            if (ois != null) {
                ois.close();
            }
        }
        return obj;
    }

    public static byte[] readSmallBinaryFile(String aFileName) throws IOException {
        Path path = Paths.get(aFileName);
        return Files.readAllBytes(path);
    }

    public static void writeSmallBinaryFile(byte[] aBytes, String aFileName) throws IOException {
        Path path = Paths.get(aFileName);
        Files.write(path, aBytes); //creates, overwrites
    }
}

Код работает нормально с main, но не тогда, когда я вызываю его функцию из другого класса, который находится в другом пакете. Вот исключение.

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org/apache/commons/codec/binary/Base64   at desede.TripleDesAlgo._encrypt(TripleDesAlgo.java:81)

И это файл .classpath Вот скриншот моего проводника пакетовЗаранее спасибо за любую помощь.


person tarun verma    schedule 02.12.2014    source источник


Ответы (1)


У вас отсутствует файл commons-codec.jar. Загрузите его с http://commons.apache.org/proper/commons-codec/download_codec.cgi. Затем добавьте путь сборки проекта. Для этого щелкните проект правой кнопкой мыши, выберите "Свойства", выберите "Путь сборки Java", откройте вкладку "Библиотека" и нажмите "Добавить внешние JAR-файлы...".

Или, если вы используете maven, добавьте зависимость для

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.6</version>
</dependency>
person outdev    schedule 02.12.2014
comment
я уже использую commons-codec-1.9, и я также установил это для пути сборки, и он отлично работает с main. Но не работает на улице. И я не использую ant или maven просто затмение. - person tarun verma; 02.12.2014
comment
Вы имеете в виду, когда вы запускаете приложение вне eclipse? В этом случае попробуйте java -cp c:\lib*; com.company.Main и поместите банки внутрь lib. - person outdev; 02.12.2014
comment
нет, у этого файла есть основной метод, поэтому мы можем запустить этот файл, но когда я использую его в том же проекте, но в другом пакете, он не работает. Вчера он работал по ошибке, я удалил связанный jar, который является jar commons-codec-1.9, но когда я добавляю его обратно, он не работает, когда я вызываю его из другого файла Java, который находится в том же проекте, но в другом пакете. - person tarun verma; 02.12.2014
comment
если вы добавите банку обратно, попробуйте Project›Clean. если это не сработает, прикрепите скриншот пути Project›Properties›Build, чтобы убедиться, что jar есть. - person outdev; 06.12.2014