`

ant打jar包时, 怎么把所依赖的jar包与从源码中编译过来class文件合并成最终的一个jar?

阅读更多

实验用例子的总体结构是这样的:

 

        .

        |-- ./build.xml

        |-- ./lib

        |   |-- ./lib/commons-logging-1.1.1.jar

        |   `-- ./lib/log4j-1.2.13.jar

        `-- ./src

            |-- ./src/com

            |   `-- ./src/com/sinoi

            |       `-- ./src/com/sinoi/dataIO

            |           `-- ./src/com/sinoi/dataIO/Main.java

            `-- ./src/log4j.properties

 

 

    这个代码很简单, 就一个Java类Main.java, 在这里就只有一句话, 通过logger写一个“Hello world”。 

 

    Java代码是: logger.info("hello world");

 

    这里就依赖了log4j和common-logging两个jar包。 

 

    我想把这两个所依赖的jar和Main.java编译后的class文件合并成一个jar后, 这样在实际应用中, 对方用时,就不用再考虑依赖jar包的问题了。 

 

    但运行时有问题, 报下面的异常:

 

         [java] Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

         [java] at com.sinoi.dataIO.Main.<clinit>(Unknown Source)

         [java] Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory

         [java] at java.net.URLClassLoader$1.run(URLClassLoader.java:202)

         [java] at java.security.AccessController.doPrivileged(Native Method)

         [java] at java.net.URLClassLoader.findClass(URLClassLoader.java:190)

         [java] at java.lang.ClassLoader.loadClass(ClassLoader.java:306)

         [java] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

         [java] at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

         [java] ... 1 more

         [java] Could not find the main class: com.sinoi.dataIO.Main. Program will exit.

         [java] Java Result: 1

 

 

    ant脚本中, 打jar包部分是这样的:

 

        <target name="jar" depends="compile">
           <copy todir="${build.dir}">
             <fileset dir="${lib.dir}"/>
           </copy>
	
           <jar destfile="${dist.dir}/${jar.name}" basedir="${build.dir}" >
                <manifest>
                    <attribute name="Main-Class" value="com.sinoi.dataIO.Main"/>
                </manifest>
           </jar>
    </target>
 

    也就是通过copy把两个依赖的jar放到build文件夹下面,然后再通过jar命令把build文件夹下的所有内容都打个包。 

 

    这个再怎么改下? 相信万能的ant还是可以做到这一点的。 

 

    实验例子见附件 。

分享到:
评论
2 楼 chillyxz 2013-07-29  
谢谢楼上。
1 楼 rmn190 2011-12-28  
将jar的执行由原来的

<jar destfile="${dist.dir}/${jar.name}" basedir="${build.dir}" >
            <manifest>
                <attribute name="Main-Class" value="com.sinoi.dataIO.Main"/>
            </manifest>
</jar>


改为:

<jar destfile="${dist.dir}/${jar.name}" basedir="${build.dir}" >
            <manifest>
                <attribute name="Main-Class" value="com.sinoi.dataIO.Main"/>
            </manifest>

		<zipfileset excludes="META-INF/*.SF" src="./lib/commons-logging-1.1.1.jar" />
     		<zipfileset excludes="META-INF/*.SF" src="./lib/log4j-1.2.13.jar" />
       </jar>



Eclipse在导出可运行jar时有一个选项可以生成相应的ant脚本, 上面的解决方式就是从此ant脚本里拷出的。

相关推荐

    ant 将依赖的jar包和classes文件一起打成可执行jar

    标题中的“ant将依赖的jar包和classes文件一起打成可执行jar”指的是使用Apache Ant工具来构建一个包含依赖库和编译后类文件的Java应用程序可执行JAR文件。Ant是一个基于XML的构建工具,它允许开发者通过定义任务来...

    ant打jar包以及制作成bat文件双击运行

    在实际开发中,你可能还需要处理依赖库,例如添加`&lt;classpath&gt;`元素来包含外部jar文件,或者使用`&lt;zipgroupfileset&gt;`来将多个jar合并到一个单一的归档文件中。同时,为了便于版本控制和团队协作,你通常会将build....

    【Ant】Ant实例(1)一个Java文件依赖于某jar包,需要打包部署

    【Ant】Ant实例(1)一个Java文件依赖于某jar包,需要打包部署 在Java开发过程中,构建和部署是必不可少的环节。Apache Ant是一个广泛使用的自动化构建工具,它允许开发者编写XML配置文件来定义构建任务,如编译源...

    Ant SVN依赖JAR包

    当使用Ant进行构建时,有时需要直接从SVN获取源码或依赖库,这时就需要配置Ant与SVN的集成,这就涉及到了"Ant SVN依赖JAR包"。 首先,要使Ant能够与SVN交互,我们需要在Ant的类路径中包含Subversion的Java绑定库...

    Ant 打可运行的jar

    每个目标都是一系列任务的集合,任务则是执行特定操作的单元,如`javac`用于编译Java源代码,`jar`用于打包成JAR文件。 在创建可运行的JAR时,我们需要指定一个主类,这个类包含`main()`方法,作为程序的入口点。...

    tomcat源码依赖包

    在Tomcat源码编译过程中,需要的jar文件主要包含以下几个方面: 1. **Java标准库**:Tomcat作为Java应用服务器,依赖于JDK提供的标准API,如Java SE的javax.servlet、java.io、java.net等核心包。 2. **Apache Ant...

    Ant源码分析(一) -- 相关文件

    在Ant的构建过程中,这个源文件会被编译成class文件,然后运行测试。 2. **build.xml**:这是Ant的构建文件,它定义了构建过程的步骤和规则。XML格式使得构建配置易于理解和维护。build.xml文件通常包括多个目标...

    ant 脚本从svn上取代码打包代码全,同时包括相关的jar包

    在给定的场景中,"ant 脚本从svn上取代码打包代码全,同时包括相关的jar包",这意味着我们需要了解如何用Ant配合Subversion(SVN)进行代码管理,并打包项目,同时处理依赖的jar文件。 首先,让我们来看看Ant脚本的...

    如何成功打jar 包以及运行

    在Java开发过程中,将代码打包成JAR(Java Archive)文件是常见的操作,这有助于部署、分发和执行Java应用程序。本篇文章将详细介绍如何成功创建并运行JAR包,主要涉及使用Ant工具进行构建。 首先,我们需要理解JAR...

    classfinal-fatjar-1.2.1.jar

    ClassFinal是一款java class文件安全加密工具,支持直接加密jar包或war包,无需修改任何项目代码,兼容spring-framework;可避免源码泄漏或字节码被反编译。执行java -jar classfinal-fatjar.jar 后按提示即可完成...

    jarjar 1.4版本源码 修改包命工具

    `jarjar` 是一个非常实用的Java工具,主要用于重打包(repackaging)JAR文件,它允许开发者修改或移动类包路径(package names),合并多个JAR文件,甚至可以对类进行混淆(obfuscation)。在Java开发过程中,当我们...

    ant 打包 java project 为ant

    标题中的“ant打包java project为jar”指的是使用Apache Ant工具将Java项目打包成JAR(Java Archive)文件的过程。Ant是Java开发中的一个构建工具,它以XML格式定义任务,可以自动化编译、测试、打包等流程。在这个...

    fatjar打包工具

    FatJar是一款广泛使用的Java开发工具,它主要用于将项目的所有依赖库合并到一个单一的JAR文件中,也就是我们常说的“fat”或“uber”JAR。这种打包方式便于分发和运行,因为用户不再需要单独管理多个JAR文件。FatJar...

    ant打包

    在软件开发中,打包是将源代码、资源文件和其他构建输出合并成一个或多个可部署单元(如JAR、WAR或EAR文件)的过程。Ant因其灵活性和广泛的社区支持,在Java项目中被广泛用于构建和打包任务。 描述中提到的链接指向...

    tomcat源码及相关依赖包

    《深入理解Tomcat源码与依赖包》 Tomcat,作为Apache软件基金会的顶级项目,是广泛应用的开源Java Servlet容器,它实现了Java EE中的Servlet和JavaServer Pages(JSP)规范。本文将深入探讨Tomcat的源码以及相关...

    使用Ant将java工程打包成bat可执行性文件

    在Java开发过程中,将一个项目打包成可执行的bat(批处理)文件是常见的需求,尤其是在需要在没有Java运行环境的计算机上运行程序时。Ant,一个由Apache软件基金会开发的构建工具,提供了强大的功能来帮助我们实现这...

    springboot+java类热加载

    **JarinJAR**是一种打包技术,它可以将多个JAR文件打包成一个大的JAR文件。在热加载场景下,JarinJAR使得在运行时能够动态替换内部的JAR,达到更新代码的目的。然而,JarinJAR并不直接支持热加载,需要配合类加载器...

    java 打包 classes 为 jar

    标题“Java 打包 Classes 为 Jar”涉及的是Java开发中的一个重要步骤,即将编译后的类文件打包成一个可执行的JAR(Java Archive)文件。这个过程对于部署和分发Java应用程序至关重要。下面我们将详细探讨这个主题。 ...

    使用ant打一个包

    在“使用ant打一个包”的场景中,我们需要理解`build.xml`的结构和任务配置,以及如何利用Ant的特性来完成编译、打包等操作。尽管现代有许多其他构建工具,如Maven和Gradle,但Ant的灵活性和可定制性使其在某些特定...

Global site tag (gtag.js) - Google Analytics