Проблемы, связанные с внешним файлом JAR, несмотря на множество испытаний - PullRequest
0 голосов
/ 26 октября 2011

Так что я почти уверен, что выглядел так же хорошо, как мог, прежде чем задавать этот вопрос, так что здесь. Я пишу Java-класс для шифрования RC4, я хотел бы использовать класс Files в Google Guava. Я компилирую, используя javac в командной строке Ubuntu. Я пытаюсь связать файл jar, guava-10.0.1.jar "с моим классом, но безуспешно.

Это фрагмент сверху:

import java.util.*;
import java.io.*;
import com.google.common.io.*;

class rc4 {

 private static int S[] = new int[256];
 private static int kLen;

 public static void main(String[] args) {
 ...

Строка, специфичная для того, что я называю, выглядит следующим образом, полностью в блоке try:

 byte plain[] = Files.toByteArray(file);

Затем я скомпилирую это:

$ javac -cp FULL/FILE/PATH/guava-10.0.1.jar rc4.java

Он компилируется, но когда я пытаюсь запустить java rc4 с опциями, которые я определил для доступа к функции, я получаю ошибку:

Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/io/Files
        at rc4.main(rc4.java:58)
Caused by: java.lang.ClassNotFoundException: com.google.common.io.Files
  at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
  at java.security.AccessController.doPrivileged(Native Method)
  at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
  at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
   ... 1 more

Я пробовал несколько разных вызовов и проверил банку, чтобы убедиться, что она не банку, не банку, не банку и т. Д. Затем я попытался использовать файл манифеста:

Manifest-Version: 1.0
Created-By: me
Main-Class: rc4
Class-path: /FULL/FILE/PATH/guava-10.0.1.jar

А затем создайте банку как таковую:

jar cvf0m rc4.jar manifest.txt rc4.class

и затем запустите его с:

java -jar rc4.jar

, с которой я получаю ту же ошибку, что и выше, но там говорится, что «rc4» не может быть найден. Итак, я немного потерян для того, что мне не хватает. Я все еще немного знаком с Java, поэтому, если я упускаю какую-то огромную, очевидно, базовую необходимость, я искренне извиняюсь за недосмотр, но если кто-то может предложить мне некоторую помощь в этом, я был бы очень признателен.

Ответы [ 2 ]

1 голос
/ 26 октября 2011

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

0 голосов
/ 26 октября 2011

Чтобы проверить, что ваш код действительно работает, вы можете попробовать вручную указать classpath:

java -cp yourProject.jar:/path/to/guava-10.0.1.jar rc4

Обратите внимание, что вам нужно указать и project и lib в classpath, как этот, или rc4, который из вашего проекта JAR не будет найден! (В качестве отступления: рассмотрите возможность использования пакетов в вашем проекте.)

Тогда, если это сработает, пришло время проверить манифест JAR:

  1. Находится ли он в каталоге внутри файла JAR с именем META-INF
  2. Это называется MANIFEST.MF
  3. Содержит ли Class-Path ваш classpath, с соответствующим регистром и так далее? Обратите внимание, что ваш атрибут называется Class-path.)
...