Java 从ant创建的Jar无法找到外部Jar

Java 从ant创建的Jar无法找到外部Jar,java,ant,jar,Java,Ant,Jar,我通过ant创建了一个可执行的jar文件,它还引用了外部jar文件mysql connector.jar。 当我执行java-jar*.jar时,它会执行,但会对所有与SQL相关的语句给出ClassNotFoundException。我已遵循中给出的步骤 如果我执行antcompile&antrun,则数据库将成功创建。 如何通过jar文件运行它 build.xml <project name="OMSInstaller" basedir="." > <propert

我通过ant创建了一个可执行的jar文件,它还引用了外部jar文件
mysql connector.jar
。 当我执行java-jar*.jar时,它会执行,但会对所有与SQL相关的语句给出
ClassNotFoundException
。我已遵循中给出的步骤

如果我执行
antcompile
&
antrun
,则数据库将成功创建。 如何通过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连接器java-*.jar


jtds-*.jar

发现了我的一个旧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:index=false对于从内存引用其他jar文件很重要,当您执行jars(java-jar)时,java将忽略传递给它的类路径属性,而使用jars类路径清单属性。您应该将主jar所依赖的任何依赖项添加到jar中。由于我已经从ant的构建文件中创建了一个jar,所以是否需要在build.xml中将清单文件作为参数传递,以便将其包含在jar中。如果没有,那么我应该如何将清单文件指定给已经创建的jar?您可以基于一个充满jar的目录动态构建类路径,并将其添加到生成的清单中。请参阅ant文档,了解如何执行此操作。我在一个旧的ant文件中执行了类似的操作。我必须添加一个答案,因为它对于注释来说太长。感谢共享构建文件。我设法创建了jar文件。但现在当我运行它时,它在*.jar中显示
无主属性。我提取了jar并检查了META-INF文件夹中的清单文件。它确实有条目
Main Class:Installer.ominstaller类路径:ominstaller-*.jar
主类和类路径真的在一行吗?它们应该是单独的,而且类路径条目不能包含通配符!必须明确列出所有文件。如果您是用我的代码生成的,并且条目中仍然有一个通配符,这可能是因为没有可引用的jar文件,即ant没有查看正确的文件夹?不,主类和类路径在单独的行上。类路径中也没有通配符,。是的,我把罐子放错地方了。现在问题解决了。谢谢