Java异常:java.lang.NoClassDefFoundError: org/apache/commons/codec/binary/Base64。

7

管理员,请不要将其标记为重复,完整地阅读我的问题。我正在加密和解密一些文本,但是当我从外部调用其加密和解密函数时,在同一个文件中运行良好,但是在主函数中则会出现运行时错误。我附上了代码。 包 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,"tarunvermacdac@gmail.com");
        byte[] codedtext1 = TripleDesDemo._encrypt(codedtext,"tarun.spicyabc@gmail.com");
        byte[] codedtext2 = TripleDesDemo._encrypt(codedtext1,"direct_tarun@yahoo.co.in");

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

        byte[] decodedtext = TripleDesDemo._decrypt(texttoDecrypt,"direct_tarun@yahoo.co.in");
        byte[] decodedtext1 = TripleDesDemo._decrypt(decodedtext,"tarun.spicyabc@gmail.com");
        byte[] decodedtext2 = TripleDesDemo._decrypt(decodedtext1,"tarunvermacdac@gmail.com");

        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
    }
}

代码在主程序中运行正常,但是当我从其他包含在不同软件包中的类中调用其函数时,就会出现问题。以下是异常信息。

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

下面是.classpath文件 这是我的包资源管理器的截图 提前感谢您的帮助。

1个回答

16
你缺少 commons-codec.jar 文件。从 http://commons.apache.org/proper/commons-codec/download_codec.cgi 下载它, 然后将其添加到项目构建路径中。要做到这一点,右键单击项目,单击“属性”,单击“Java 构建路径”,打开“库”选项卡,并单击“添加外部 JARs...”。
或者,如果你正在使用 Maven,请添加依赖项:
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.6</version>
</dependency>

1
我已经在使用commons-codec-1.9,并且已将其设置为构建路径,在主程序中运行良好。但是在外部却无法正常工作。我没有使用ant或maven,只是使用eclipse。 - tarun verma
你的意思是在 Eclipse 之外运行应用程序吗?那么请尝试使用 java -cp c:\lib*; com.company.Main 命令,并将 JAR 包放置在 lib 目录下。 - outdev
这个文件有main方法,所以我们可以运行它,但是当我在同一个项目的不同包中使用它时,它不起作用。昨天它还能工作,但是我不小心删除了相关的jar包,其中包括commons-codec-1.9.jar,但是当我把它添加回来后,当我从同一项目但不同包中的另一个Java文件调用它时,它就不起作用了。 - tarun verma
如果你已经重新添加了jar包,请尝试使用Project>Clean。如果这不起作用,请附上你的Project>Properties>Build path截图,确保jar包已经存在。 - outdev
1
我正在处理一个类似的问题,有人建议在运行时使其可用,因此将其添加到WEB-INF/lib中可能会有所帮助。点击这里查看 - Swastik Raj Ghosh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接