5

我正在尝试从我的 Eclipse 创建一个 jar,并且为了能够使用外部 .jar,我在类路径中使用了这个带有多个 .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 中插入比需要更多的数据

4

3 回答 3

7

最后,我将所有库复制到 /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>
于 2012-06-08T13:21:50.410 回答
3

对不起,如果我的问题对你来说很明显。


*启动命令 *

为了排除任何疑问,您没有尝试使用这种命令启动您的 jar 吗?

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 来构建我的应用程序,但主要思想是。

于 2012-06-08T12:19:58.017 回答
2

清单不允许在Class-Path:标记中使用绝对路径。您有两种选择:

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

  • 行的最大长度不得超过 72 个字符,并且在换行后必须在第一列中插入一个空格。
  • 最后一行后面必须有回车,否则无法正确解析文件
于 2018-09-07T08:24:53.123 回答