实验用例子的总体结构是这样的:
.
|-- ./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还是可以做到这一点的。
实验例子见附件 。