问题:我写了一个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
非常感谢
艾登
答案 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
他们需要保持一致