`

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脚本里拷出的。

相关推荐

Global site tag (gtag.js) - Google Analytics