Проблемы, связанные с внешним файлом JAR, несмотря на множество испытаний
Так что я почти уверен, что выглядел так хорошо, как мог, прежде чем задавать этот вопрос, так что здесь. Я пишу 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 ответа
Чтобы проверить, что ваш код действительно работает, вы можете попробовать вручную указать путь к классу:
java -cp yourProject.jar:/path/to/guava-10.0.1.jar rc4
Обратите внимание, что вам нужно указать как project, так и lib в classpath, или rc4
который из вашего проекта JAR не будет найден! (В качестве отступления: рассмотрите возможность использования пакетов в вашем проекте.)
Тогда, если это работает, пришло время проверить манифест JAR:
- Находится ли он в каталоге внутри файла JAR с именем META-INF
- Это называется MANIFEST.MF
- Ли
Class-Path
содержать ваш путь к классу, с соответствующим регистром и так далее? Обратите внимание, что ваш атрибут называетсяClass-path
вместо.)
Компиляция не упаковывает ссылочные библиотеки в ваш jar. Вы должны либо извлечь библиотеки в ваш jar-файл, либо передать путь к классу guava во время выполнения.