2012-06-07 33 views
4

我试图从我的eclipse创建一个jar,为了能够使用外部.jars,我在类路径中使用了带有多个.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 

显然,如果我不把这些库在classpath中出现以下错误:

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:我知道,与像脂肪-JAR一些插件,你可以让它工作,但我不希望插入更多的数据比需要在我的.jar

+0

如果你有包含你BatchTester.class你罐子的根文件夹“SRC”你检查? – brimborium

+0

显然我的班级在那里... 否则,当没有定义类路径时,我不会有其他错误。 – magodiez

+0

啊,现在我看到你的问题。 'Main-Class:BatchTester'和'Class-Path:src P:/ Too ...'怎么样?或者是你的BatchTester实际上在一个包“src”中(这很奇怪)? – brimborium

回答

6

最后我复制所有的库进入/ lib文件夹并将它们添加到.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> 
+0

非常感谢你!我花了几个小时在这个问题上试图添加多个罐子在清单中的类路径,但这个zipfileset的解决方案完美无缺,速度如此之快!!!!!!! – Jan

+0

如果我可以不止+1次,我肯定会这样做。 – Jan

2

很抱歉,如果我的问题给你听起来很明显。


* 启动命令*

为了排除任何怀疑,你不是试图用这种命令启动你的罐子?

java -jar myJar.jar -cp ./lib 

如果您使用classpath选项,您可能没有;)。选项--classpath(或-cp)和-jar不能一起使用。

也希望使用相对路径,比如./lib而不是P:/ Tools/...但是,无论如何,这并不能解决您的问题。


* 包位置*

正如brimborium说,什么是真正的你包? src听起来很奇怪。我们怀疑这个错误。

在你的BatchTester类中,你为包指令编写了什么?什么都没有(即不推荐的默认包?)?

难道你类(摆脱掉评论)开始

public class BatchTester { 

在这种情况下,可以肯定,SRC不应mentionned。

这里是一个适用于我的清单示例。

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为建立自己的应用程序,但主要的想法是英寸

相关问题