java.язык.Исключение ClassNotFoundException: org.apache.commons.codec.binary.Base64

#java #servlets

#java #сервлеты

Вопрос:

Здесь я передаю три параметра этому методу sign. В этой строке

подпись = новая строка(Base64.encodeBase64(mac.doFinal(data.getBytes(UTF_8_Encoding))));

Я получаю сообщение об ошибке:

СЕРЬЕЗНАЯ ПРОБЛЕМА: Servlet.service() для сервлета [com.asp.amz.amzServlet] в контексте с path [/amazon] вызвал исключение [выполнение сервлета вызвало исключение] с основной причиной java.lang.Исключение ClassNotFoundException: org.apache.commons.codec.binary.Base64

 String Key = "z/0qfiE ScjxHy2gSwmHqP0rZ6fT9zhVgsNt";
String signatureMethod = "HmacSHA256";
String data = "sandbox.amazon.com/cobranded-ui/actions/start?callerKey=AKIAJZOKEUCXF7RKSCNAamp;callerReference=callerReferenceSingleUseamp;currencyCode=USDamp;paymentReason=HarryPotter 1-5 DVD setamp;pipelineName=SingleUseamp;returnURL=http://localhost:8888/amazonamp;signatureMethod=HmacSHA256amp;signatureVersion=2amp;transactionAmount=5amp;version=2009-01-09";

    private static String sign(String data, String key, String signatureMethod) throws SignatureException
    {
        System.out.println(" In sign block ");
        String signature = "";
        try {
            System.out.println(" In sign Try block ");
            Mac mac = Mac.getInstance(signatureMethod);
            mac.init(new SecretKeySpec(key.getBytes(), signatureMethod));
            signature = new String(Base64.encodeBase64(mac.doFinal(data.getBytes(UTF_8_Encoding))));
            System.out.println(" In sign Try block ");
        } catch (Exception e) {
            System.out.println(" In sign catch block ");
            throw new SignatureException("Failed to generate signature: "   e.getMessage(), e);         
        }
        System.out.println(" End sign block "   signature);
        return signature;
    }
  

Комментарии:

1. убедитесь, что в вашем пути к классу есть Base64 .

2. Я надеюсь, что это просто ошибка: String Key = z/0qfiE ScjxHy2gSwmHqP0rZ6fT9zhVgsNt;

3. @oliholz: Я включил этот файл jar в свой путь сборки

4. Известно ли вам, что вы опубликовали некомпилируемый код? Строковые значения должны заключаться в кавычки.

Ответ №1:

просто добавьте commons-codec.jar в ваш путь к классу

Комментарии:

1. Я включил этот файл jar в свой путь сборки, но снова та же ошибка

2. не в пути сборки, вам нужно сделать доступными во время выполнения. добавьте его в WEB-INF/lib

3. @Jigar Joshi — Большое вам спасибо за комментарий к WEB-INF / lib.

Ответ №2:

Для этого могут быть две причины:

Первая причина: 1. Сам jar не добавлен в pom.xml . В этом случае добавьте версию зависимости в pom.xml у которого есть класс, для которого вы получаете ошибку

Вторая причина: Когда в проект добавлено несколько jar-файлов, а версия jar, близкая к проекту, не имеет этого класса. Вы можете проверить ближайший jar в вашем проекте, используя команду ниже

 mvn dependency:tree -Dverbose -Dincludes=jar-name-casuing-conflict
  

введите описание изображения здесь

Как только вы определите версию Jar, в которой есть этот класс. Вы можете решить проблему, добавив этот jar непосредственно в свой проект pom.xml

или вы можете исключить jar, который находится ближе к вашему проекту, который не имеет этого класса и может указывать на другой jar в проекте.

Пример: он исключит jar из проекта «org.cassandraunit», после чего он увидит, что следующий jar, близкий к проекту, будет использоваться в вашем проекте

    <dependency>
            <groupId>org.cassandraunit</groupId>
            <artifactId>cassandra-unit</artifactId>
            <version>3.1.3.2</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.commons</groupId>
                    <artifactId>commons-lang3</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
  

Ответ №3:

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

введите описание изображения здесь