使用类路径中的多个库自定义清单创建 jar

问题描述 投票:0回答:4

我正在尝试从我的 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 中插入比需要更多的数据

java eclipse jar manifest
4个回答
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>

4
投票

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


*启动命令*

为了排除任何疑问,你没有尝试用这种命令启动你的罐子吗?

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.


2
投票

清单不允许 Class-Path: 标签中的绝对路径。你有两个选择:

  • 使用您在自己的答案中已经提到的相对路径

  • 通过 file 协议使用绝对路径。这在其他地方也得到了回答并且它有效 jar 清单中的绝对路径名与相对路径名

    类路径:file:///P:/Tools/xstream/1.4.2/lib/kxml2-2.3.0.jar

此外,您不应该在不知道几个限制的情况下手动编辑 manifest.mf:

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

0
投票

清单版本: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

© www.soinside.com 2019 - 2024. All rights reserved.