Date Tags Java / Ant

如何生成可执行的jar

如果想要生成的Jar文件能直接执行,就必须指定main函数的类名,具体是在jar中创建 以下目录文件结构,

xxxx.jar
  |- META-INF
    |-  MANIFEST.MF

并且 MANIFEST.MF 文件中需要指定

Main-Class: xxx.yyy.zzz.YourMainClassName

具体在Ant中实现如下,build.xml中的jar 段

<jar jarfile="${dist}/my-app.jar" basedir="${build}">
    <manifest>
        <attribute name="Main-Class" value="xxx.yyy.zzz.YourMainClassName" />
    </manifest>
</jar>

如何解决第三方jar找不到

比如说我们的main class中引用了 org.apache.commons.lang3.StringUtils 方法, 直接执行java -jar dist/my-app.jar的话会有exception

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils
    at com.mycompany.app.Main.main(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang3.StringUtils
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)

这是因为加载jar的时候找不到这个第三方包。最简单的方法是修改MANIFEST.MF, 在其中 添加classpath, 如果我们希望最后发布的文件结构如下

my-app.jar
lib/
  |- commons-lang3-3.1.jar

修改build.xml

<jar jarfile="${dist}/my-app.jar" basedir="${build}">
    <manifest>
        <attribute name="Main-Class" value="com.mycompany.app.Main" />
        <attribute name="Class-Path" value="lib/commons-lang3-3.1.jar" />
    </manifest>
</jar>

这样执行java -jar my-app.jar的时候就不会出找不到jar异常了。