关于外部jar文件的问题,尽管有许多试验

时间:2011-10-25 20:56:44

标签: java error-handling jar manifest javac

所以我很确定在问这个问题之前我的表现一如既往,所以这里就是这样。 我正在编写一个用于RC4加密的Java类,我想利用Google Guava中的Files类。我正在使用Ubuntu命令行上的javac进行编译。我试图将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

我尝试了几个不同的调用,并检查了jar以确保它不是罐子,罐子里,罐子里等等。然后我尝试使用清单文件:

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

然后创建一个jar:

jar cvf0m rc4.jar manifest.txt rc4.class

然后运行:

java -jar rc4.jar

我得到了与上面相同的错误,但是它说“rc4”无法找到。 所以,我有点迷失于我所缺少的东西。我仍然对Java很新鲜,所以如果我错过了一些非常明显的基本必要性,我真诚地为疏忽道歉,但如果有人能在这方面给我一些帮助,我会非常感激。

2 个答案:

答案 0 :(得分:1)

编译不会将引用的库打包到jar中。您必须将库提取到jar文件中,或者在运行时传入guava类路径。

答案 1 :(得分:0)

要测试您的代码是否真正有效,您可以尝试手动指定类路径:

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

请注意,您需要在类路径上指定两个项目和lib,或者来自项目JAR的rc4将无法找到! (顺便说一句:考虑在项目中使用包。)

然后,如果可行的话,是时候检查你的JAR清单了:

  1. 是否位于名为META-INF
  2. 的JAR文件内的目录中
  3. 是否为MANIFEST.MF
  4. Class-Path是否包含您的类路径,具有适当的大小写等等?请注意,您的属性改为Class-path。)