Java 在类路径中创建带有多个库的自定义清单的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.

我正试图从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.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

此外,在不了解以下限制的情况下,不应手动编辑manifest.mf:

  • 行的最大长度不得超过72个字符,在断开一行后,必须在第一列中插入空格
  • 最后一行之后必须有回车符,否则无法正确解析文件

您是否检查过jar的根目录中是否有包含BatchTester.class的文件夹“src”?显然我的类就在那里。。。否则,当没有定义类路径时,我就不会有另一个错误。啊,现在我明白你的问题了。
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>