1

一个基本的 Java,它显示一个带有图像(picture.jpg)和一个从 app.properties 读取的文本标签的 GUI 窗口,也使用 log4j 库。
它具有以下结构(build 和 dist 目录由 ant 'build' 和 'dist' 目标添加): 目录结构

整个应用程序作为一个 Eclipse 项目

基本功能:
“构建”目标将所有源文件编译到“构建”目录,并将运行应用程序所需的其他资源复制到“构建”目录。然后可以使用“运行”目标运行。'dist' 目标只是将整个 'build' 目录压缩到一个 jar 文件中,并将其放置到 'dist' 文件夹中。


我希望罐子完全独立的问题。目前它使用“runjar”目标运行,也可以在单击 jar 时运行。但是,如果我将 jar 文件移到别处,它将无法启动,因此它仍然依赖于 jar 之外的文件,尽管 jar 包含所有必要的文件。这也可以从 jar 的MANIFEST.MF文件中看出。

Main-Class: com.my.demo.app.Main
Class-Path: ../build/classes/ ../build/img/ ../build/conf/ ../build/ .
 ./build/lib/log4j-1.2.17.jar

此外,如果我做错了什么,欢迎任何其他反馈。

构建.xml

<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." name="DemoApp" default="build">
    <property file="app.properties"/>

    <path id="compile.classpath" description="Classpath for compiling classes to 'build' dir">
        <fileset dir="lib">
            <include name="*.jar"/>
        </fileset>
    </path>

    <path id="run.classpath" description="Classpath for running compiled app in 'build' dir">
        <pathelement location="${build.classes.dir}"/>
        <pathelement location="${build.dir}/img"/>
        <pathelement location="${build.dir}/conf"/>
        <pathelement location="${build.dir}"/>
        <fileset dir="${build.dir}/lib">
            <include name="*.jar"/>
        </fileset>
    </path>

    <target name="clean" description="Remove files generated by 'build' and 'dist'">
        <delete dir="${build.dir}"/>
        <delete dir="${dist.dir}"/>
    </target>

    <target name="compile" description="Compiles the source files">
        <mkdir dir="${build.classes.dir}"/>
        <javac
            srcdir="${src.dir}"
            destdir="${build.classes.dir}"
            debug="true"
            debuglevel="lines,vars,source"
            encoding="utf-8"
            compiler="modern"
            target="1.7"
            source="1.7"
            includeantruntime="false">
            <classpath refid="compile.classpath"/>
        </javac>
    </target>

    <target name="build" depends="compile" description="Builds project">
        <!--Copy app.properties to build/app.properties-->
        <copy todir="${build.dir}">
            <fileset dir="${basedir}" includes="*.properties"/>
        </copy>

        <!--Copy picture.jpg to build/img/picture.jpg-->
        <copy todir="${build.dir}/img">
            <fileset dir="${basedir}/etc/img"/>         
        </copy>

        <!--Copy jars in lib to build/lib-->
        <copy todir="${build.dir}/lib">
            <fileset dir="${lib.dir}" includes="*.jar"/>
        </copy>

        <!--copy log4j.xml to build/conf/log4j.xml -->
        <copy todir="${build.dir}/conf">
            <fileset dir="${basedir}/etc" includes="log4j.xml"/>
        </copy>
    </target>


    <target name="run" depends="build" description="Execute application located in 'build'">
        <java classname="com.my.demo.app.Main" fork="yes" classpathref="run.classpath"/>
    </target>

    <target name="dist" depends="clean,build" description="Create distributable jar">
        <mkdir dir="${dist.dir}"/>
        <jar jarfile="${dist.dir}/DemoApp.jar" basedir="${build.classes.dir}"/>
        <manifestclasspath property="manifest.classpath" jarfile="${dist.dir}/DemoApp.jar">
            <classpath refid="run.classpath" />
        </manifestclasspath>

        <jar destfile="${dist.dir}/DemoApp.jar" basedir="${build.dir}">
            <manifest>
                <attribute name="Main-Class" value="com.my.demo.app.Main"/>
                <attribute name="Class-Path" value="${manifest.classpath}"/>
            </manifest>
        </jar>
    </target>

    <target name="runjar" description="Execute jar created with dist target">
        <java jar="${dist.dir}/DemoApp.jar" fork="true"/>
    </target>

</project>

应用程序属性

build.dir=${basedir}/build
build.classes.dir=${build.dir}/classes
src.dir=${basedir}/src
lib.dir=${basedir}/lib
dist.dir=${basedir}/dist

read.from.app.properties=This is read from app.properties

谢谢你。

4

0 回答 0