如果添加到包中,则无法编译jar

时间:2012-02-09 13:22:45

标签: java jar package

问题:我写了一个hello world java程序,编译并创建了一个jar文件 - PERFECT,没问题。

我现在将以下内容添加到源代码的顶部

package za.ac.uj.csc2a;

保存代码,将所有文件放在正确的目录中,每次使用此批处理文件

进行编译
del *.class
del *.jar
del *.txt

echo compiling HelloWorld.java.....

javac HelloWorld.java

javap -c HelloWorld.class > ByteCode.txt

jar cfe HelloWorld.jar HelloWorld HelloWorld.class

java -jar za.ac.uj.csc2a.HelloWorld.jar

我明白了,

Error: Unable to acces jarfile za.ac.uj.csc2a.HelloWorld.jar

任何建议......


这是最终的bat文件

del *.class
del *.jar
del *.txt
RD /Q /S bin

echo compiling HelloWorld.java.....

MD bin

javac -d bin za/ac/uj/csc2a/HelloWorld.java
javap -c bin/za/ac/uj/csc2a/HelloWorld.class > ByteCode.txt
jar cfe HelloWorld.jar za.ac.uj.csc2a.HelloWorld -C bin .
java -jar HelloWorld.jar
pause

非常感谢

艾登

6 个答案:

答案 0 :(得分:2)

-jar选项接受文件名,而不是

你应该做的

java -jar HelloWorld.jar

但请记住,您需要使用-jar选项在清单文件中指定要执行的主类。

清单文件应该看起来像

Main-Class: za.ac.uj.csc2a.HelloWorld

并在m命令中使用jar选项包含它。

此外,您似乎在jar文件的根目录中添加.class文件。它应该在za.ac.uj.csc2a目录


如果你不想使用清单文件,你也可以像这样启动它(也许这就是你正在尝试的):

java -cp HelloWorld.jar za.ac.uj.csc2a.HelloWorld

答案 1 :(得分:1)

你的罐子名为Helloworld.jar:

 jar cfe HelloWorld.jar HelloWorld HelloWorld.class

但是你用包名称作为jar的前缀来调用它:

 java -jar za/ac/uj/csc2a/HelloWorld.jar

 java -jar HelloWorld.jar

应该是对的。

通常,如果使用包,则将类和源放在不同的目录中。典型的树看起来像

proj
|-- src
|   |-- za
|       |-- ac
|           `-- HelloWorld.java
|-- bin
    |-- za
        |-- ac
            `-- HelloWorld.class

您可以移动到src目录,并使用:

进行编译
 javac -d ../bin za/ac/HelloWorld.java

(为方便起见,减少了包/路径长度)如果需要,这将在bin中生成目录结构(或通常为classes

然后,要使用正确的目录结构来包装整个内容,请更改为proj,然后发出:

jar cfe HelloWorld.jar za.ac.HelloWorld -C bin . 

点代表整个目录。

jar -help 

会告诉你更多选择。要创建一个可运行的jar,你也需要一个清单。否则你可以开始你的应用程序:

java -cp HelloWorld.jar za.ac.HelloWorld 

(再次缩短路径)。

注意,目录的结构必须反映包声明。您不能省略部分(za),并进入下一个目录(ac)。要运行的类是za.ac.HelloWorld,因此无论是在文件系统还是在jar中,都会在za / ac /中搜索它。

如果您学会从正确的基础发出命令,那很容易。如果没有,你会得到多年的反复试验。

对于可以与java -jar一起开始的jar,您需要一个清单。 jar命令生成模板。你在那里添加

Main-Class: za.ac.HelloWorld

以下空白行。再说一遍:需要包装的全名。 Main-Class不能写为Mainclass。 HelloWorld不能跟着.class或.java - 常见的错误!但是如您所知,您可以使用-e开关指定主类,但是再次:包括包名称。

答案 2 :(得分:0)

您的jar文件名为HelloWorld.jar,而不是za.ac.uj.csc2a.HelloWorld.jar。显然,java没有找到它。

jar文件内容必须遵守包层次结构,因此 jar文件中,HelloWorld.class必须位于文件夹za/ac/uj/csc2a中。

答案 3 :(得分:0)

你应该打电话     java -jar HelloWorld.jar 代替     java -jar za.ac.uj.csc2a.HelloWorld.jar

答案 4 :(得分:0)

  

将所有文件放在正确的目录中

你确定吗?因为如果你的代码在一个包za.ac.uj.csc2a中,那么你的源文件必须在一个目录za\ac\uj\csc2a中,你应该用这样的命令编译它:

javac za\ac\uj\csc2a\HelloWorld.java

并且在JAR文件中它应该位于具有该名称的目录中,因此您应该使用如下命令打包JAR:

jar cf HelloWorld.jar za\ac\uj\csc2a\HelloWorld.class

如果它是可执行jar,您将只能使用java -jar执行它,换句话说,如果您使用正确的Main-Class属性向JAR添加清单文件。如果你没有这样做,你应该能够通过以下方式从JAR运行它:

java -cp HelloWorld.jar za.ac.uj.csc2a.HelloWorld

有关如何将应用程序打包在可执行JAR文件中的详细信息,请参阅Packaging Programs in JAR Files,以便您可以使用

执行它
java -jar HelloWorld.jar

答案 5 :(得分:0)

您正在创建一个名为HelloWorld.jar的jar:

jar cfe HelloWorld.jar HelloWorld HelloWorld.class

然后尝试调用另一个jar名称(za.ac.uj.csc2a.HelloWorld.jar):

java -jar za.ac.uj.csc2a.HelloWorld.jar

他们需要保持一致