实验用例子的总体结构是这样的:
.
|-- ./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还是可以做到这一点的。
实验例子见附件 。
本文详细介绍了如何使用Ant脚本将Java项目中的依赖库和源代码打包为单个jar文件,并解决了运行时出现的NoClassDefFoundError异常。通过调整Ant脚本配置,确保了项目在实际应用中无需额外依赖jar包。
1361

被折叠的 条评论
为什么被折叠?



