我需要创建我的java应用程序的jar文件。为此,我首先创建了一个名为Manifest.MF的文件,在该文件中我存储了以下代码
Manifest-Version: 1.0
Main-Class: com.demo.test.JavaTest
然后我在命令提示符
中提出了以下命令jar cvfm JavaAppDemo.jar MANIFEST.MF“C:\ JavaSamples \ MyApp”
MyApp是我的项目目录,我创建了包并使用了其他jar文件
然后我尝试使用java命令运行jar
java -jar JavaAppDemo.jar
我得到了以下例外
线程“main”中的异常 java.lang.NoClassDefFoundError: COM /演示/测试/ JavaTest
引起: 抛出java.lang.ClassNotFoundException: com.demo.test.JavaSamp 在java.net.URLClassLoader $ 1.run(URLClassLoader.java:202) 在java.security.AccessController.doPrivileged(Native 方法) 在java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 在sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:301) 在java.lang.ClassLoader.loadClass(ClassLoader.java:248) 无法找到主类: com.demo.test.JavaTest。计划将 退出。
请告诉我,我想创建一个jar,我必须将我的项目目录中的文件捆绑到那个jar文件,当我解压缩jar我得到了我的项目文件夹,但是当我运行我的jar时我得到了上面的例外,所以我对环孔存在的地方感到困惑。
答案 0 :(得分:0)
您应该使用此语法来构建jar:
jar cvfm myapp.jar myapp.MF -C classes myclasspath
答案 1 :(得分:0)
好的一些事情:
以下是运行应用程序的方法:
java -classpath myapplication.jar:.. -Dlog4j.info -Dlog4j.configuration=file:../../conf/log4j.xml com.mywebsite.Benchmarks
如果你不需要,请把log4j的东西拿出来。我相信你只是错过了“com.mywebsite.Benchmarks”行,它告诉jar哪个编译类开始。如果您的jar中已经编译了Benchmarks,FullTest,MainApp,并且main方法在Benchmarks中,那么您需要告诉jar。
至于建造你的罐子......
最简单的方法是使用某种ant构建脚本。
<target name="build">
<delete file="MyApplication.jar" />
<delete dir="_classes" />
<mkdir dir="_classes" />
<javac srcdir="src" destdir="_classes" debug="true">
<classpath path="../../3rdParty/log4j/log4j-1.2.16.jar" />
</javac>
<jar jarfile="MyApplication.jar" basedir="_classes"/>
</target>
这应该让你开始。但是当你运行它时,你需要确定一些事情:
您拥有类路径上的所有依赖项。
你告诉jar从哪个类开始。
答案 2 :(得分:0)
我能想到的一些事情:
错误消息说它无法找到文件com / demo / test / JavaTest.class。您可以尝试使用zip文件程序查看您的jar文件(.jar文件就像.zip文件一样被压缩)以查看该文件是否真的不在那里。我怀疑错误代码实际上是正确的,因为它实际上并不存在,但至少你可以亲眼看到它(或不看它)。请记住,它必须以“com”文件夹开头。
也许你会混淆.class文件和.java文件。你确定你的.java文件实际编译成.class文件吗?这可能不太可能,但也可以说。
也许你需要在最后用"C:\JavaSamples\MyApp\*"
运行你的jar命令来挑选出正确目录中的所有文件。也许你告诉jar命令包含文件夹“MyApp”。你实际上并不想要那个文件夹;你想要里面的所有文件。