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还是可以做到这一点的。 

    实验例子见附件 。

猜你喜欢

转载自rmn190.iteye.com/blog/1138789
今日推荐