JAR中的Ant build.xml问题
当我让ant构建java项目(默认操作为“run”)时,程序正常启动。没有警告或错误 但是当我从终端(java-JAR…)运行ant构建的JAR时,一切看起来都很好,直到我使用外部LIB中的任何功能(例如swingx、日期选择器)。一个巨大的例外是thown:JAR中的Ant build.xml问题,ant,jar,Ant,Jar,当我让ant构建java项目(默认操作为“run”)时,程序正常启动。没有警告或错误 但是当我从终端(java-JAR…)运行ant构建的JAR时,一切看起来都很好,直到我使用外部LIB中的任何功能(例如swingx、日期选择器)。一个巨大的例外是thown: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at org.jdesktop.swingx.plaf.basic.BasicMonthV
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at org.jdesktop.swingx.plaf.basic.BasicMonthViewUI.getTraversableGridPositionAtLocation(BasicMonthViewUI.java:906)
at org.jdesktop.swingx.plaf.basic.BasicMonthViewUI$Handler.mousePressed(BasicMonthViewUI.java:1723)
at java.awt.Component.processMouseEvent(Component.java:6501)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6269)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4860)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4686)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4489)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2713)
at java.awt.Component.dispatchEvent(Component.java:4686)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:680)
at java.awt.EventQueue$4.run(EventQueue.java:678)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
以下是我的ant build.xml:
<project name="Jamm" basedir="." default="run">
<property name="src.dir" value="src" />
<property name="build.dir" value="build" />
<property name="classes.dir" value="${build.dir}/classes" />
<property name="jar.dir" value="${build.dir}/jar" />
<property name="lib.dir" value="lib" />
<property name="main-class" value="jamm.Main" />
<buildnumber file="build.num" />
<property name="res.dir.name" value="res" />
<property name="res.dir" value="${src.dir}/${res.dir.name}" />
<property file="${res.dir}/version_num.properties" />
<property name="jar.filename" value="${ant.project.name}_v${versionnumber}-b${build.number}.jar" />
<tstamp>
<format property="TODAY" pattern="yyyy-MM-dd HH:mm:ss" />
</tstamp>
<path id="classpath">
<fileset dir="${lib.dir}" includes="**/*.jar" />
</path>
<target name="clean">
<delete dir="${build.dir}" />
</target>
<target name="compile" depends="clean">
<mkdir dir="${classes.dir}" />
<javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" includeantruntime="true"/>
</target>
<target name="dist" depends="compile">
<mkdir dir="${jar.dir}" />
<jar destfile="${jar.dir}/${jar.filename}" basedir="${classes.dir}">
<restrict>
<name name="**/*.class" />
<archives>
<zips>
<fileset dir="${lib.dir}" includes="**/*.jar" />
</zips>
</archives>
</restrict>
<manifest>
<attribute name="Main-Class" value="${main-class}" />
<attribute name="Built-By" value="${user.name}" />
<attribute name="Build-Version" value="v${versionnumber}_b${build.number}" />
<attribute name="Built-Date" value="${TODAY}" />
</manifest>
<fileset dir="${src.dir}">
<include name="${res.dir.name}/**/*" />
</fileset>
</jar>
</target>
<target name="run" depends="dist">
<java fork="true" classname="${main-class}">
<classpath>
<path refid="classpath" />
<path location="${jar.dir}/${jar.filename}" />
</classpath>
</java>
</target>
当我从Eclipse导出一个可运行的JAR时,它甚至可以在控制台上运行。当您在终端中执行时,是否使用与在
运行
目标中相同的类路径来执行
在您的运行
目标中,类路径不仅是您的jar,而且是refid=classpath的路径中的任何内容
既然您说您使用
java-jar
在终端中执行,我想这证实了您的类路径对于这两个上下文是不同的。org.jdesktop.swingx.plaf.basic.BasicMonthViewUI.GetTraversableGridLocation(BasicMonthViewUI.java:906)中的空值是什么?好的,谢谢,这是错误!当我从run
中删除refid=classpath
时,它与从命令行中运行它是一样的!但是如何设置类路径呢?正如我之前写的:当从Eclipse导出JAR时,一切都正常。我建议您将Eclipse导出创建的JAR与使用ant构建的JAR进行比较。Eclipse向META-INF添加了maven
和services
文件夹,MANIFEST.MF包含更多内容,JAR的根目录中有一些lib(linux-amd64.lib、win-x86.lib等)。我还将exlipse中的ant文件与build.xml进行了比较。但是除了我们项目中的硬编码lib之外,没有什么区别。修复了它!感谢tipp。删除“过滤器”行:
就足够了。现在所有文件都存在了!