【问题标题】:Jar created from ant not able to find external jars从蚂蚁创建的罐子无法找到外部罐子
【发布时间】:2015-10-08 15:20:00
【问题描述】:

我通过ant创建了一个可执行的jar文件,它也引用了mysql-connector.jar,一个外部的jar文件。 当我执行 java -jar *.jar 时,它会执行,但会在所有 SQL 相关语句上提供ClassNotFoundException。我已按照Ant Tutorial 中给出的步骤进行操作。

如果我执行ant compileant run,则数据库创建成功。 如何让它通过 jar 文件运行?

build.xml

<project name="OMSInstaller" basedir="." >

    <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="Installer.OMSinstaller"/>
     <path id="classpath">
            <fileset dir="${lib.dir}" includes="**/*.jar"/>
        </path>
    <target name="clean">
        <delete dir="${build.dir}"/>
    </target>

    <target name="compile">
        <mkdir dir="${classes.dir}"/>
        <javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath"/>
    </target>

     <target name="jar" depends="compile">
            <mkdir dir="${jar.dir}"/>
            <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
                <manifest>
                    <attribute name="Main-Class" value="${main-class}"/>
                </manifest>
            </jar>
        </target>

     <target name="run" depends="jar">
            <java fork="true" classname="${main-class}">
                <classpath>
                    <path refid="classpath"/>
                    <path location="${jar.dir}/${ant.project.name}.jar"/>
                </classpath>
            </java>
        </target>


</project>

lib 文件夹:

mysql-connector-java-*.jar

jtds-*.jar

【问题讨论】:

  • 从内存中,当您执行 jars (java -jar) 时,java 将忽略传递给它的类路径属性,而是使用 jars 类路径清单属性。您应该将主 jar 依赖的任何依赖项添加到 jar 清单中
  • 哦,好吧。因为我已经从 ant 的构建文件创建了一个 jar,所以无论如何都要在 build.xml 中将清单文件作为参数传递,以便它包含在 jar 中。如果不是,那么我应该如何将清单文件指定为已创建的 jar?
  • 您可以基于一个装满 jars 的目录动态构建类路径并将其添加到生成的清单中。请参阅 ant 文档了解如何执行此操作
  • 找到了一个旧的 ant 文件,我在其中做了类似的事情,必须添加答案,因为评论太长了

标签: java ant jar


【解决方案1】:

找到我的一个旧 ant 文件,我在其中自动构建类路径字符串并将其添加到生成的类文件的清单中

<target name="BuildJar">
    <property name="liblocation" location="${libdir}" />
    <pathconvert property="jarclasspathstring" pathsep=" ">
        <path>
            <fileset dir="${liblocation}">
                <include name="*.jar" />
            </fileset>
        </path>
        <map from="${liblocation}" to="." />
    </pathconvert>
    <jar destfile="${builddir}/${jarname}" basedir="${bindir}" update="true" level="9" index="false" filesOnly="true">
        <manifest>
            <attribute name="Main-Class" value="${mainclass}" />
            <attribute name="Class-Path" value="${jarclasspathstring}" />
        </manifest>
    </jar>
</target>

libdir 是一个属性,用于指定所有引用的库所在的目录

PS:如果要引用其他jar文件,index=false很重要

【讨论】:

  • 感谢分享构建文件。我设法创建了 jar 文件。但是现在当我运行它时,它会显示 no main attribute, in *.jar 。我提取了 jar 并检查了 META-INF 文件夹中的清单文件。它确实有条目Main-Class: Installer.OMSinstaller Class-Path: OMSInstaller-*.jar
  • Main-Class 和 Class-Path 真的在一条线上吗?它们应该是分开的 此外,Class-Path 条目不能包含通配符!必须明确列出所有文件。如果你用我的代码生成了它,但你的条目中仍然有一个通配符,这可能是因为没有 jar 文件可以引用,即 ant 没有查看正确的文件夹?
  • 不,Main-Class 和 Class-Path 在不同的行上。类路径中也没有通配符。但是,是的,我为罐子提供了错误的位置。现在问题解决了。谢谢!
猜你喜欢
  • 2015-12-04
  • 2020-06-07
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多