Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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。在课堂上使用它。在命令行中使用jar执行类?_Java_Linux_Jar - Fatal编程技术网

Java 如何创建一个jar。在课堂上使用它。在命令行中使用jar执行类?

Java 如何创建一个jar。在课堂上使用它。在命令行中使用jar执行类?,java,linux,jar,Java,Linux,Jar,我正试图部分解决一个问题。 这是我的第一部分 我需要创建一个JAR,从java类调用该JAR并在命令行中执行它 这就是我所做的 目录结构: root->com->test->sample->Sample1.java Sample1.java是这样的: package com.test.sample; public class Sample1 { // --- Native methods //public native boole

我正试图部分解决一个问题。 这是我的第一部分

我需要创建一个JAR,从java类调用该JAR并在命令行中执行它

这就是我所做的

目录结构: root->com->test->sample->Sample1.java

Sample1.java是这样的:

        package com.test.sample;
        public class Sample1 {

        // --- Native methods
        //public native boolean booleanMethod(boolean bool);

        // --- Main method to test our native library
        public void Sample1() {

        }

        public void callingBool() {
            //System.loadLibrary("Sample1");
            //boolean bool = this.booleanMethod(true);
            //System.out.println("booleanMethod: returned" + bool);
            System.out.println("booleanMethod: Called without loading 
sample");
            }
        }
我用这个根目录创建了一个Jar。使用命令

    jar cvf asd.jar com

    Output:
    added manifest
    adding: com/(in = 0) (out= 0)(stored 0%)
    adding: com/test/(in = 0) (out= 0)(stored 0%)
    adding: com/test/sample/(in = 0) (out= 0)(stored 0%)
    adding: com/test/sample/Sample1.java(in = 494) (out= 236) 
    (deflated 52%)

    jar -tf asd.jar

    META-INF/
    META-INF/MANIFEST.MF
    com/
    com/test/
    com/test/sample/
    com/test/sample/Sample1.java
现在创建了JAR。我将JAR复制粘贴到另一个目录“jaronly”

将另一个Java文件Sample1Caller添加到/jaronly中,即:

    import  com.test.sample.Sample1;

    public class Sample1Caller {

        // --- Native methods
        //public native boolean booleanMethod(boolean bool);


            // --- Main method to test our native library
        public static void main(String[] args) {
            //System.loadLibrary("Sample1");
            Sample1 sample = new Sample1();
            sample.callingBool();
            System.out.println("Callled Sample1 now" );
        }
    }
在此之后,我仅在/jar中编译Sample1Caller.java

javac -cp .:./asd.jar Sample1Caller.java
这将编译并生成2个类文件Sample1Caller.class和Sample1.class

我不确定是否应该创建Sample1.class(我已经从asd.jar中引用了它)

当我使用下面的命令执行Sample1Caller时,我得到以下错误

    java -cp .:./asd.jar Sample1Caller

    Exception in thread "main" java.lang.NoClassDefFoundError: 
    com/test/sample/Sample1
    at Sample1Caller.main(Sample1Caller.java:12)
    Caused by: java.lang.ClassNotFoundException: com.test.sample.Sample1
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.lo
    Class(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more
它编译但不执行。我的执行命令、生成.jar文件或用java编译jar是否有问题


PS:我以前几乎没有在这里提出任何问题,所以请原谅我的格式设置。

JAR文件应该包含类而不是源。因此,在创建asd.jar之前,应该编译Sample1.java。这行就行了

javac com/test/sample/*.java
但是Sample1.java仍然在JAR中,您不希望它在那里

要为构建添加更多结构,我建议您创建以下文件夹结构:

 sample_project
 sample_project/src
 sample_project/src/com/test/sample/Sample1.java
 sample_project/target
 sample_project/build.bat
那么build.bat的内容将是:

::编译
cd src
javac com/test/sample/*.java-d../target
::创建jar
cd../目标
jar cvf asd.jar com
::完成
光盘

在编译
Sample1.java
之后,您的JAR应该包含
com/test/sample/Sample1.class
,而不是(仅)源文件
com/test/sample/Sample1.java
。。。。这是因为您在运行
jar
之前没有编译
Sample1
,谢谢。这真是个愚蠢的错误。我只是错过了编译我的.java。也许我应该休息一下:)我应该从我的罐子通货紧缩的输出中意识到这一点谢谢。这真是个愚蠢的错误。我只是错过了编译我的.java。也许我应该休息一下:)我应该从罐子的输出中意识到这一点。