我正在尝试从我的 eclipse 创建一个 jar,为了能够使用外部 .jars,我在类路径中使用这个清单和多个 .jars:
Manifest-Version: 1.0
Sealed: true
Main-Class: src.BatchTester
Class-Path: . P:/Tools/xstream/1.4.2/lib/kxml2-2.3.0.jar P:/Tools/xstream/1.4.2/lib/xstream-1.4.2.jar P:/Tools/StringTemplate/4.0.5/lib/antlr-3.3-complete.jar P:/Tools/StringTemplate/4.0.5/lib/ST-4.0.5.jar P:/Tools/Jdbc/lib/sqljdbc4.jar
显然,如果我不将库放在类路径中,则会出现以下错误:
java.lang.NoClassDefFoundError: com/thoughtworks/xstream/XStream
但是当我将它们放入类路径时,错误变为:
java.lang.NoClassDefFoundError: src/BatchTester
所以它似乎找不到我的主类。我在类路径中尝试了几种可能性,比如在类路径中添加或删除
.
,但无法使其工作。
知道如何解决这个问题吗???
感谢您的时间和努力,
PS:创建 .jar 后,清单中的类路径如下所示:
Class-Path: . P:/Tools/xstream/1.4.2/lib/kxml2-2.3.0.jar P:/Tools/xstr
eam/1.4.2/lib/xstream-1.4.2.jar P:/Tools/StringTemplate/4.0.5/lib/ant
lr-3.3-complete.jar P:/Tools/StringTemplate/4.0.5/lib/ST-4.0.5.jar P:
/Tools/Jdbc/lib/sqljdbc4.jar
换行和空格,但即使将其更改为“正确”格式后,我也遇到了同样的问题。
PS2:我知道使用像 Fat-Jar 这样的插件可以让它工作,但我不想在我的 .jar 中插入比需要更多的数据
最后,我将所有库复制到 /lib 文件夹中,并使用 ant 目标将它们添加到 .jar 中,因为 IT 人员似乎没问题(因为它是一个小应用程序)。
这是蚂蚁(万一对某人有用):
<?xml version="1.0" encoding="UTF-8"?>
<project name="BatchTester" default="compile" basedir=".">
<property name="external" value="lib/external-libs.jar"/>
<target name="compile">
<javac srcdir="jav"
source="1.6"
/>
<echo>Creating jar File</echo>
<!--create a new .jar with all the external jars in /lib-->
<jar jarfile="${external}">
<zipgroupfileset dir="lib/">
<include name="**/*.jar"/>
</zipgroupfileset>
</jar>
<!--<sleep seconds="1"/>-->
<!--create .jar file-->
<jar jarfile="BatchTester.jar" index="true" filesetmanifest="mergewithoutmain">
<fileset dir=".">
<include name="**/jav/**/*.class"/>
<exclude name="**/jav/**/*.java"/>
</fileset>
<zipfileset src="${external}">
<exclude name="META-INF/*.SF"/>
</zipfileset>
<manifest>
<attribute name="Main-Class" value="jav.BatchTester"/>
</manifest>
</jar>
<!--delete previously created extern .jar-->
<delete file="${external}"/>
</target>
</project>
对不起,如果我的问题对你来说很明显。
*启动命令*
为了排除任何疑问,你没有尝试用这种命令启动你的罐子吗?
java -jar myJar.jar -cp ./lib
如果你使用类路径选项,你可能没有;)。选项 --classpath(或 -cp)和 -jar 不能一起使用。
也更喜欢使用相对路径,例如 ./lib 而不是 P:/Tools/... 但是,无论如何,这不会解决您的问题。
*包裹位置*
正如 brimborium 所说,你真正的包裹是什么? src 听起来很奇怪。我们怀疑这是一个错误。
在你的 BatchTester 类中,你为 package 指令写了什么?什么都没有(即不推荐的默认包?)?
你上课是从什么开始的(去掉评论)
public class BatchTester {
在那种情况下,肯定不应该提及 src。
这是一个对我有用的清单示例。
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: jrRevy
Build-Jdk: 1.6.0_31
Main-Class: com.sopragroup.training.dojo1.MainSwingApp
Class-Path: dojo1-0.5.0-SNAPSHOT-lib/spring-core-3.1.1.RELEASE.jar doj
o1-0.5.0-SNAPSHOT-lib/spring-asm-3.1.1.RELEASE.jar [blablabla]
具有以下执行结构
/
|
+ --dojo1-0.5.0-SNAPSHOT.jar
|
+ --dojo1-0.5.0-SNAPSHOT-lib/
|
+ --spring-core-3.1.1.RELEASE.jar
很明显,我正在使用 maven 来构建我的应用程序,但主要思想是 in.
清单不允许 Class-Path: 标签中的绝对路径。你有两个选择:
使用您在自己的答案中已经提到的相对路径
通过 file 协议使用绝对路径。这在其他地方也得到了回答并且它有效 jar 清单中的绝对路径名与相对路径名
类路径:file:///P:/Tools/xstream/1.4.2/lib/kxml2-2.3.0.jar
此外,您不应该在不知道几个限制的情况下手动编辑 manifest.mf:
清单版本:1.0
主类:armsMain
类路径:lib/mysql-connector-java-5.1.19-bin.jar lib/commons-collections4-4.1.jar lib/commons-lang3-3.12.0.jar lib/poi-3.17.jar lib/poi -ooxml-3.17.jar lib/poi-ooxml-schemas-3.17.jar bin/xmlbeans-3.1.0.jar