Java 在类路径中创建带有多个库的自定义清单的jar
我正试图从eclipse创建一个jar,为了能够使用外部.jars,我将此清单与类路径中的多个.jar一起使用:Java 在类路径中创建带有多个库的自定义清单的jar,java,eclipse,jar,manifest,Java,Eclipse,Jar,Manifest,我正试图从eclipse创建一个jar,为了能够使用外部.jars,我将此清单与类路径中的多个.jar一起使用: 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.
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中插入比需要更多的数据
*启动命令* 为了排除任何疑问,您没有尝试使用这种命令启动您的jar吗
java -jar myJar.jar -cp ./lib
若您使用classpath选项,可能并没有;)。选项--classpath(或-cp)和-jar不能一起使用
也更喜欢使用相对路径,例如./lib而不是p:/Tools/。。。但是,无论如何,这并不能解决你的问题
*包裹位置* 正如布里姆·鲍里姆所说,你真正的包裹是什么?src听起来很奇怪。我们怀疑这是一个错误 在BatchTester类中,您为package指令编写了什么?无(即不推荐的默认包?) 你的课程是从(去掉评论)开始的吗 在这种情况下,当然不应该提及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构建我的应用程序,但主要思想是。最后,我将所有lib复制到/lib文件夹中,并将它们添加到带有ant目标的.jar中,因为IT人员似乎对它没问题(因为它是一个小应用程序) 以下是蚂蚁(以防对某人有用):
创建jar文件
清单不允许类Path:tag中存在绝对路径。你有两个选择:
- 使用您在自己的答案中已经提到的相对路径
- 通过文件协议使用绝对路径。这一点在其他地方也得到了回答,而且行之有效 类路径:file:///P:/Tools/xstream/1.4.2/lib/kxml2-2.3.0.jar
- 行的最大长度不得超过72个字符,在断开一行后,必须在第一列中插入空格
- 最后一行之后必须有回车符,否则无法正确解析文件
Main类:BatchTester
和类路径:src P:/Too…
如何?或者您的BatchTester实际上在一个包“src”中(这会很奇怪)?是的,我的BatchTester在src包中。。。我试过你的解决方案,同样的问题…:(非常感谢!我花了好几个小时来解决这个问题,试图在清单中向类路径添加多个JAR,但是这个使用zipfileset的解决方案工作得非常完美,而且速度非常快!!!!!如果我能多次+1,我肯定会这么做的。
/
|
+ --dojo1-0.5.0-SNAPSHOT.jar
|
+ --dojo1-0.5.0-SNAPSHOT-lib/
|
+ --spring-core-3.1.1.RELEASE.jar
<?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>