[英]create jar with custom manifest with multiple libraries in classpath
我正在尝试从我的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复制到/ 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选项,则可能没有;)。 选项--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构建我的应用程序,但主要的想法是。
清单不允许Class-Path:标记中的绝对路径。 你有两个选择:
通过文件协议使用绝对路径。 这在其他地方也得到了回答,它在jar清单中与绝对路径名相对
Class-Path:file:/// P:/Tools/xstream/1.4.2/lib/kxml2-2.3.0.jar
此外,您不应手动编辑manifest.mf而不了解一些限制:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.