Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 梯度运行;编译的JAR崩溃,ClassNotFoundException_Java_Gradle_Jar_Noclassdeffounderror_Jitpack - Fatal编程技术网

Java 梯度运行;编译的JAR崩溃,ClassNotFoundException

Java 梯度运行;编译的JAR崩溃,ClassNotFoundException,java,gradle,jar,noclassdeffounderror,jitpack,Java,Gradle,Jar,Noclassdeffounderror,Jitpack,为什么JAR崩溃,java.lang.NoClassDefFoundError,是由ClassNotFoundException引起的,而从gradle运行效果良好?客户端如何使用JAR有问题吗 应该说,上面的输出是“hello[fred]”,这很好。hello world客户端代码: package net.bounceme.mordor.hello.client; import static java.lang.System.out; import net.bounceme.mordor.

为什么JAR崩溃,
java.lang.NoClassDefFoundError
,是由
ClassNotFoundException
引起的,而
从gradle运行
效果良好?客户端如何使用JAR有问题吗

应该说,上面的输出是“hello[fred]”,这很好。hello world客户端代码:

package net.bounceme.mordor.hello.client;

import static java.lang.System.out;
import net.bounceme.mordor.hello.library.HelloLibrary;

public class Client {

    public static void main(String[] args) {
        new Client().runLibrary();
    }

    private void runLibrary() {
        HelloLibrary library = new HelloLibrary();
        out.println(library.hello("fred"));
    }

}
Netbeans抱怨net.bounceme.mordor.hello.library.HelloLibrary的import语句似乎是正确的:

thufir@mordor:~$ 
thufir@mordor:~$ cp .gradle/caches/modules-2/files-2.1/com.github.THUFIR/hello_api/dev/fa670823cfe9548b87c75f224a48a1089eab0b35/hello_api-dev.jar jar
thufir@mordor:~$ 
thufir@mordor:~$ cd jar
thufir@mordor:~/jar$ 
thufir@mordor:~/jar$ jar -xf hello_api-dev.jar 
thufir@mordor:~/jar$ 
thufir@mordor:~/jar$ cat META-INF/MANIFEST.MF 
Manifest-Version: 1.0

thufir@mordor:~/jar$           
thufir@mordor:~/jar$ ll net/bounceme/mordor/hello/library/HelloLibrary.class 
-rw-rw-r-- 1 thufir thufir 728 Mar 11  2016 net/bounceme/mordor/hello/library/HelloLibrary.class
thufir@mordor:~/jar$ 
以下是客户端JAR:

thufir@mordor:~/NetBeansProjects/hello_client$              
thufir@mordor:~/NetBeansProjects/hello_client$ cd build/libs/
thufir@mordor:~/NetBeansProjects/hello_client/build/libs$ 
thufir@mordor:~/NetBeansProjects/hello_client/build/libs$ jar -xf hello_client.jar 
thufir@mordor:~/NetBeansProjects/hello_client/build/libs$ 
thufir@mordor:~/NetBeansProjects/hello_client/build/libs$ cat META-INF/MANIFEST.MF 
Manifest-Version: 1.0
Main-Class: net.bounceme.mordor.hello.client.Client
Class-Path: hello_api-dev.jar groovy-all-2.4.1.jar

thufir@mordor:~/NetBeansProjects/hello_client/build/libs$ 
thufir@mordor:~/NetBeansProjects/hello_client/build/libs$ ll net/bounceme/mordor/hello/client/Client.class 
-rw-rw-r-- 1 thufir thufir 912 Mar 11 02:28 net/bounceme/mordor/hello/client/Client.class
thufir@mordor:~/NetBeansProjects/hello_client/build/libs$ 
在我看来,类路径正确地包含了
hello\u api-dev.jar

这似乎值得注意:

在可能的情况下,避免以编译的方式使用依赖项 文件树(目录:“lib”,包括:['*.jar'])。基于管理的依赖关系 在诸如Maven或JCenter之类的存储库中,使用它们要容易得多 与随机目录中的依赖项一致。如果这些是 不希望发布到开放源代码的内部库 工件存储库,那么可能值得建立一个本地连接 实例或类似实例

但是,我不太确定这是否是问题所在,因为我似乎使用的是来自jitpack的正确JAR和正确的包装

我甚至为客户机将库添加到
libs
文件夹中:

thufir@mordor:~/NetBeansProjects/hello_client/build/libs$ 
thufir@mordor:~/NetBeansProjects/hello_client/build/libs$ jar -vft hello_client.jar 
     0 Fri Mar 11 02:50:28 PST 2016 META-INF/
   135 Fri Mar 11 02:50:28 PST 2016 META-INF/MANIFEST.MF
     0 Fri Mar 11 02:50:28 PST 2016 net/
     0 Fri Mar 11 02:50:28 PST 2016 net/bounceme/
     0 Fri Mar 11 02:50:28 PST 2016 net/bounceme/mordor/
     0 Fri Mar 11 02:50:28 PST 2016 net/bounceme/mordor/hello/
     0 Fri Mar 11 02:50:28 PST 2016 net/bounceme/mordor/hello/client/
   927 Fri Mar 11 02:50:28 PST 2016 net/bounceme/mordor/hello/client/HelloClient.class
thufir@mordor:~/NetBeansProjects/hello_client/build/libs$ 
thufir@mordor:~/NetBeansProjects/hello_client/build/libs$ jar -vft libs/hello_api-dev.jar 
     0 Fri Mar 11 01:59:38 PST 2016 META-INF/
    25 Fri Mar 11 01:59:38 PST 2016 META-INF/MANIFEST.MF
     0 Fri Mar 11 01:59:38 PST 2016 net/
     0 Fri Mar 11 01:59:38 PST 2016 net/bounceme/
     0 Fri Mar 11 01:59:38 PST 2016 net/bounceme/mordor/
     0 Fri Mar 11 01:59:38 PST 2016 net/bounceme/mordor/hello/
     0 Fri Mar 11 01:59:38 PST 2016 net/bounceme/mordor/hello/library/
   728 Fri Mar 11 01:59:38 PST 2016 net/bounceme/mordor/hello/library/HelloLibrary.class
thufir@mordor:~/NetBeansProjects/hello_client/build/libs$ 
thufir@mordor:~/NetBeansProjects/hello_client/build/libs$ java -jar hello_client.jar 
Exception in thread "main" java.lang.NoClassDefFoundError: net/bounceme/mordor/hello/library/HelloLibrary
    at net.bounceme.mordor.hello.client.HelloClient.runLibrary(HelloClient.java:13)
    at net.bounceme.mordor.hello.client.HelloClient.main(HelloClient.java:9)
Caused by: java.lang.ClassNotFoundException: net.bounceme.mordor.hello.library.HelloLibrary
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 2 more
thufir@mordor:~/NetBeansProjects/hello_client/build/libs$ 
这就引出了一个问题:为什么gradle不为客户复制这个库?kludge:

thufir@mordor:~/NetBeansProjects/hello_client/build/libs$ 
thufir@mordor:~/NetBeansProjects/hello_client/build/libs$ cp /home/thufir/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy-all/2.4.1/a9ca9c9de09361ec2a18d2c058d2524fbd8eae0c/groovy-all-2.4.1.jar hello_api-dev.jar hello_client.jar .
cp: ‘hello_api-dev.jar’ and ‘./hello_api-dev.jar’ are the same file
cp: ‘hello_client.jar’ and ‘./hello_client.jar’ are the same file
thufir@mordor:~/NetBeansProjects/hello_client/build/libs$ 
thufir@mordor:~/NetBeansProjects/hello_client/build/libs$ jar -i hello_client.jar 
thufir@mordor:~/NetBeansProjects/hello_client/build/libs$ 
thufir@mordor:~/NetBeansProjects/hello_client/build/libs$ ll
total 6816
drwxrwxr-x 2 thufir thufir    4096 Mar 11 03:41 ./
drwxrwxr-x 6 thufir thufir    4096 Mar 11 03:30 ../
-rw-rw-r-- 1 thufir thufir 6937913 Mar 11 03:41 groovy-all-2.4.1.jar
-rw-rw-r-- 1 thufir thufir    1422 Mar 11 03:39 hello_api-dev.jar
-rw-rw-r-- 1 thufir thufir    2722 Mar 11 03:41 hello_client.jar
thufir@mordor:~/NetBeansProjects/hello_client/build/libs$ 
thufir@mordor:~/NetBeansProjects/hello_client/build/libs$ java -jar hello_client.jar 
hello [fred]
thufir@mordor:~/NetBeansProjects/hello_client/build/libs$ 
1.)为什么这样做?

2.)建造这些罐子的正确方法是什么?

这必须是阅读精美手册实际有用的少数情况之一(如果不是唯一的话)。我看到了“I”开关,它显示:

thufir@mordor:~/NetBeansProjects/hello_client$ 
thufir@mordor:~/NetBeansProjects/hello_client$ jar -i build/libs/hello_client.jar 
java.io.FileNotFoundException: build/libs/hello_api-dev.jar (No such file or directory)
    at java.util.zip.ZipFile.open(Native Method)
    at java.util.zip.ZipFile.<init>(ZipFile.java:219)
    at java.util.zip.ZipFile.<init>(ZipFile.java:149)
    at java.util.jar.JarFile.<init>(JarFile.java:166)
    at java.util.jar.JarFile.<init>(JarFile.java:103)
    at sun.tools.jar.Main.getJarPath(Main.java:1163)
    at sun.tools.jar.Main.getJarPath(Main.java:1179)
    at sun.tools.jar.Main.genIndex(Main.java:1195)
    at sun.tools.jar.Main.run(Main.java:317)
    at sun.tools.jar.Main.main(Main.java:1288)
thufir@mordor:~/NetBeansProjects/hello_client$ 
thufir@mordor:~/NetBeansProjects/hello\u client$
thufir@mordor:~/NetBeansProjects/hello\u client$jar-i build/libs/hello\u client.jar
java.io.FileNotFoundException:build/libs/hello\u api-dev.jar(没有这样的文件或目录)
位于java.util.zip.ZipFile.open(本机方法)
位于java.util.zip.ZipFile(ZipFile.java:219)
位于java.util.zip.ZipFile(ZipFile.java:149)
位于java.util.jar.JarFile。(JarFile.java:166)
位于java.util.jar.JarFile。(JarFile.java:103)
位于sun.tools.jar.Main.getJarPath(Main.java:1163)
位于sun.tools.jar.Main.getJarPath(Main.java:1179)
位于sun.tools.jar.Main.genIndex(Main.java:1195)
位于sun.tools.jar.Main.run(Main.java:317)
位于sun.tools.jar.Main.Main(Main.java:1288)
thufir@mordor:~/NetBeansProjects/hello\u client$

然而,我并不真正理解这个输出,只是好奇地发现它是一个“未找到文件”异常。

你说的“复制库”是什么意思?你希望它在哪里?您正在将哪些插件应用于您的项目?看起来您正在创建
hello_client.jar
,希望它能正常工作-您还需要将其打包用于DistributionOnl,谢谢您为我提问;我没有问一个明确的问题。我如何包装以供分发?所以运行时依赖项,特别是
hello\u api-dev.jar
就在“那里”。
thufir@mordor:~/NetBeansProjects/hello_client$ 
thufir@mordor:~/NetBeansProjects/hello_client$ jar -i build/libs/hello_client.jar 
java.io.FileNotFoundException: build/libs/hello_api-dev.jar (No such file or directory)
    at java.util.zip.ZipFile.open(Native Method)
    at java.util.zip.ZipFile.<init>(ZipFile.java:219)
    at java.util.zip.ZipFile.<init>(ZipFile.java:149)
    at java.util.jar.JarFile.<init>(JarFile.java:166)
    at java.util.jar.JarFile.<init>(JarFile.java:103)
    at sun.tools.jar.Main.getJarPath(Main.java:1163)
    at sun.tools.jar.Main.getJarPath(Main.java:1179)
    at sun.tools.jar.Main.genIndex(Main.java:1195)
    at sun.tools.jar.Main.run(Main.java:317)
    at sun.tools.jar.Main.main(Main.java:1288)
thufir@mordor:~/NetBeansProjects/hello_client$