我想放置不同目录的路径(其中包含目前在d:/ext_jars
上的jar)。
运行build.xml之后。我希望那个路径应该采用那个可运行的jar。
目前该jar正在给我错误,因为类路径不存在(以前是c:/project/lib/*.jars
,转换为D:/ext_jars
)。
请帮助我,如何在build.xml的类路径中设置该外部目录?
<?xml version="1.0"?>
<project name="MyProject" default="deploy" basedir="." >
<property file="manifest.mf" />
<property name="dir.src" value="src" />
<property name="dir.build" value="bin" />
<property name="dir.dist" value="dist/MyProject" />
<property name="dir.lib" value="lib" />
<!-- Creates the output directories -->
<target name="prepare">
<mkdir dir="${dir.build}" />
<mkdir dir="${dir.dist}" />
<mkdir dir="${dir.dist}/${dir.csvdata}" />
<mkdir dir="${dir.dist}/${dir.MH}" />
</target>
<target name="clean" description="Remove all generated files.">
<delete dir="${dir.build}" />
<delete dir="${dir.dist}" />
</target>
<path id="build.classpath">
<fileset dir="${dir.lib}">
<include name="**/*.jar" />
<include name="**/*.zip" />
</fileset>
</path>
<path id="build.classpath.ref">
<fileset dir="D:/ext_jars">
<include name="**/*.jar" />
<include name="**/*.zip" />
</fileset>
</path>
<target name="compile" depends="prepare" description="Compile all source code.">
<!--<javac srcdir="${dir.src}" destdir="${dir.build}" debug="true">-->
<javac destdir="${dir.build}" debug="true">
<classpath refid="build.classpath" />
<classpath refid="build.classpath.ref" />
<src path="src"/>
</javac>
<copy todir="${dir.build}">
<fileset dir="${dir.src}">
<exclude name="**/*.java" />
</fileset>
</copy>
</target>
<pathconvert property="classpath" refid="build.classpath">
</pathconvert>
<pathconvert property="classpath" refid="build.classpath.ref">
</pathconvert>
<target name="jar" depends="compile" description="Generates ${project.name}.Jar in the 'dist' directory.">
<jar jarfile="${dir.dist}/${ant.project.name}.jar">
<fileset dir="${dir.build}" includes="**/*.*" />
<manifest>
<attribute name="Class-Path" value="${Class-Path}" />
<attribute name="Main-Class" value="${Main-Class}" />
</manifest>
</jar>
</target>
<target name="deploy" depends="clean,jar">
<copy todir="${dir.dist}/${dir.lib}">
<fileset dir="${dir.lib}">
<include name="**/*.jar" />
<include name="**/*.zip" />
</fileset>
</copy>
</target>
使用此代码运行项目后它运行良好,但是在运行由此代码创建的jar后,它没有运行它是通过错误,如下所示:
Exception in thread "main" java.lang.NoClassDefFoundError: dowlibpkg/DowLib
at mypkg.MainApp.main(MainApp.java:109)
Caused by: java.lang.ClassNotFoundException: dowlibpkg.DowLib
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 1 more
SO创建的Jar没有运行../我想让它运行,任何人都可以帮助我
=============================================== ===============
清单 - 版本:1.0 Class-Path:lib / org.springframework.asm-3.0.1.RELEASE \ lib / org.springframework.beans-3.0.1.RELEASE \ lib / org.springframework.context-3.0.1.RELEASE \ lib / org。 springframework.core-3.0.1.RELEASE \ lib / org.springframework.expression-3.0.1.RELEASE \ lib / org.springframework.oxm-3.0.1.RELEASE \ lib / org.springframework.web-3.0.1。发布 Main-Class:myProject.MainApp
答案 0 :(得分:0)
根据我在评论中提供的链接中的一些提示,您可以尝试这个(我还没试过):
<target depends="init" name="build-projects">
<property name="myproject.root.path" location="d:/ext_jars"/>
<path id="class.path">
<fileset dir="${myproject.root.path}">
<include name="*.jar"/>
<exclude name="${ant.project.name}.jar"/>
</fileset>
</path>
<manifestclasspath property="jar.classpath" jarfile="${myproject.root.path}/${ant.project.name}.jar">
<classpath refid="class.path"/>
</manifestclasspath>
<jar destfile="${myproject.root.path}/${ant.project.name}.jar" basedir="classes/app" excludes="*.properties">
<manifest>
<attribute name="Main-Class" value="path.to.my.MainClass" />
<attribute name="Class-Path" value="${jar.classpath}"/>
</manifest>
</jar>
</target>
Ant任务生成的示例MANIFEST.MF:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.2
Created-By: 1.6.0_29-b11 (Sun Microsystems Inc.)
Main-Class: path.to.my.MainClass
Class-Path: Filters.jar RXTXcomm.jar collections-generic-4.01.jar colt
-1.2.0.jar commons-codec-1.5.jar commons-io-2.0.1.jar commons-validat
or-1.3.1.jar concurrent-1.3.4.jar forms-1.3.0.jar gdal.jar geotiff-ja
i.jar jai_imageio-1.1.jar jakarta-oro-2.0.1.jar java-image-scaling-0.
8.5.jar jcommander-1.7.jar jgroups-2.12.1.Final.jar jna.jar jung-algo
rithms-2.0.1.jar jung-api-2.0.1.jar jung-graph-impl-2.0.1.jar jung-vi
sualization-2.0.1.jar nimrodlf-1.2.jar platform.jar stax-api-1.0.1.ja
r swingx-beaninfo-1.6.2.jar swingx-core-1.6.2.jar vecmath-1.3.1.jar v
lcj-1.2.0.jar wstx-asl-3.2.6.jar
正如您所看到的,Class-Path中列出的所有外部jar库都遵循主应用程序将使用的jar的确切名称。所有这些文件必须与主应用程序的jar文件路径位于同一文件路径中。主应用程序的类(通常使用main()方法)将从MANIFEST.MF的Main-Class调用,其jar不能包含在Class-Path中。如果一切正确,罐子将可以运行。
不要担心MANIFEST.MF的奇怪格式;它由Ant任务以80列文本样式生成。
答案 1 :(得分:0)
有几种方法可以摆弄java类路径,比如使用类路径命令行选项或编辑CLASSPATH变量,但从根本上说,您以后为自己创建的问题是您的构建依赖于某个目录结构。
这使得分享您的代码变得困难,并且肯定会惹恼可能与您合作的其他开发人员。有时更好的做法是加倍努力,让你的依赖项在网站上可用(或找到他们已经可用的网站)并获取ant下载它们,解压缩它们,然后每次从同一位置将它们添加到类路径中(例如你创建的build / lib目录。
当然,依赖管理是Maven(http://maven.apache.org)的全部内容,所以也许值得一看。
杰夫