【问题标题】:Issues linking external jar file, despite many trials尽管进行了多次试验,但仍存在链接外部 jar 文件的问题
【发布时间】:2011-12-15 07:07:35
【问题描述】:

所以我很确定在问这个问题之前我看起来已经尽力了,所以就这样吧。 我正在编写一个用于 RC4 加密的 Java 类,我想使用 Google Guava 中的 Files 类。我在 Ubuntu 命令行上使用 javac 进行编译。我正在尝试将 jar 文件 guava-10.0.1.jar" 链接到我的班级但没有成功。

这是一个从顶部开始的sn-p:

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 以确保它不是 jar、在 jar 中、在 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 还很陌生,所以如果我遗漏了一些明显的基本必需品,我真诚地为疏忽道歉,但如果有人能在这方面给我一些帮助,我将不胜感激。

【问题讨论】:

    标签: java error-handling jar manifest javac


    【解决方案1】:

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

    【讨论】:

    • 我想过留下自己的答案,但我不确定要添加什么。大概总结了一下。关于问题的标题,Java 中没有“链接”。都是运行时参考。
    • 您好,谢谢您的回复。所以,仍然处于不同的模式,因此我使用“链接”。但是当我用 javac 编译时不是:
    【解决方案2】:

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

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

    请注意,您需要在类路径中指定 both 项目和 lib,否则将找不到来自项目 JAR 的 rc4! (顺便说一句:考虑在你的项目中使用包。)

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

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

    【讨论】:

    • 我认为这是其他海报所建议的,但你更清楚一点。感谢你们俩。是的,我终于可以检查了,它确实运行了!我将重新检查我的清单。编辑:是的,我确实有一个小写的“p”,它运行。我陷入了一些奇怪的无限循环,但它运行了。现在感觉非常失明,但非常感谢您抽出宝贵的时间。
    猜你喜欢
    • 1970-01-01
    • 2011-07-22
    • 2020-10-21
    • 2016-10-13
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    相关资源
    最近更新 更多