如何在build.xml中设置不同的路径

时间:2012-02-10 06:41:35

标签: java ant classpath relative-path build.xml

我想放置不同目录的路径(其中包含目前在d:/ext_jars上的jar)。 运行build.xml之后。我希望那个路径应该采用那个可运行的jar。

目前该jar正在给我错误,因为类路径不存在(以前是c:/project/lib/*.jars,转换为D:/ext_jars)。

请帮助我,如何在build.xml的类路径中设置该外部目录?


我的代码: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没有运行../我想让它运行,任何人都可以帮助我

=============================================== ===============

MANIFEST.MF

清单 - 版本: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

2 个答案:

答案 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)的全部内容,所以也许值得一看。

杰夫