【问题标题】:ANT problem with jar filejar 文件的 ANT 问题
【发布时间】:2011-06-21 19:09:11
【问题描述】:

我在生成工作 jar 文件时遇到问题。我想最终得到一个可以通过使用命令 java -jar myjar.jar 自行运行的 jar 文件

目前为止

<project default="jar" name="Create Runnable Jar fecrudbreset">
<target name="clean">
    <delete dir="bin"/>
    <delete dir="build"/>
</target>
<target name="compile">
    <mkdir dir="./build"/>
    <javac srcdir="./src" destdir="./build">
        <classpath>
            <pathelement location="./lib/sqljdbc4.jar"/>
        </classpath>
    </javac>
</target>
<target name="jar" depends="compile">
    <mkdir dir="./bin"/>
    <jar destfile="./bin/fecrudbreset.jar" >
        <manifest>
            <attribute name="Main-Class" value="FecruDBreset"/>
            <attribute name="Class-Path" value="."/> 
            <attribute name="Built-By" value="${user.name}"/>
        </manifest>
        <fileset dir="./build"/>
        <zipfileset dir="./lib" includes="sqljdbc4.jar"/>
    </jar>
</target>
</project>

编译工作,但是当我尝试运行应用程序时,我收到以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: com/microsoft/sqlserver/jdbc/SQLServerDataSource
    at FecruDBreset.main(Unknown Source)

更新: 我拥有的主类使用默认包。该类已找到并开始运行,但当它找不到似乎的 sql 驱动程序时失败。我想我不明白为什么它找不到它。

下面是主类的定义:

import java.sql.*;
import com.microsoft.sqlserver.jdbc.*;

public class FecruDBreset
{

/*
 * Used to reset / nuke fecru database
 */
public static void main(String[] args)
{

另外,如果我解压缩生成的 jar 文件,内容如下所示:

META-INF/
META-INF/MANIFEST.MF
FecruDBreset.class
sqljdbc4.jar

更新 2:我的源代码树如下所示:

|-- bin
|   `-- fecrudbreset.jar
|-- build
|   `-- FecruDBreset.class
|-- build.xml
|-- lib
|   `-- sqljdbc4.jar
|-- readme.txt
`-- src
    `-- FecruDBreset.java

有人知道我做错了什么吗?提前非常感谢。 乍得

【问题讨论】:

  • 您如何尝试运行该应用程序?
  • 当你运行它时,你需要在类路径中有 sqljdbc4.jar

标签: java ant jar


【解决方案1】:

@chadneal:另外,如果我解压缩生成的 jar 文件,内容如下所示:

META-INF/
META-INF/MANIFEST.MF
FecruDBreset.class
sqljdbc4.jar

主 Jar 不能包含 sqljdbc4.jar。相反,应该将对该 Jar 的引用添加到清单中的类路径中。

【讨论】:

  • 啊,我明白了。因此,我将 sql 驱动程序 jar 文件复制到与我的 jar 文件相同的目录中,它工作得很好。那么这是否意味着我需要使用某种类型的 jarinjarloader 将驱动程序放入我的 jar 文件中?
  • @chadneal: “这是否意味着我需要使用某种类型的 jarinjarloader 才能在我的 jar 文件中包含驱动程序?”我不熟悉那些,虽然我听说过很多关于“fatjar”的事情。但是,使用 Ant 进行构建使得创建单个 Jar 变得简单。只需从每个依赖 Jar 中提取资源,然后将这些资源添加到最终的“主”Jar。要么使用 Java Web Start 部署批次(如果有 GUI)。
【解决方案2】:

快速猜测。好像找不到你的类 com.microsoft.sqlserver/*

包含这个的罐子在哪里?您的默认类路径只是“.”,但看起来您将 sqljdbc4.jar 放在 jarfile 内的 lib 目录中。

您可以修改 Class-Path 以包含 ./lib,也可以将 sqljdbc4.jar jar 移动到 jarfile 的根目录。

【讨论】:

    【解决方案3】:

    就像您在 ant 文件中所做的那样,您需要在类路径中添加 sqlserver jdbc 驱动程序。 否则java将找不到它。

    为此,您需要在 myjar.jar 的清单中添加依赖 jar 文件

    您应该能够使用 ant 的 jar 命令通过传递包含以下内容的 manifest.txt 文件来完成此操作:

    清单版本:1.0 Class-Path:sqljdbc4.jar(必要时更新路径) 创建者:1.6.0(Sun Microsystems Inc.)

    http://download.oracle.com/javase/tutorial/deployment/jar/downman.html

    【讨论】:

    • 使用 -jar 选项运行时会忽略类路径。
    • java -cp fecrudbreset.jar/sqljdbc4.jar -jar fecrudbreset.jar 失败:线程“main”中的异常 java.lang.NoClassDefFoundError: fecrudbreset/jar
    • 埃德温是对的。我更新了答案。需要在jar文件中添加依赖sqljdbc4.jar。
    • sqljdbc4.jar文件在jar文件里还是找不到。
    • 它不在 jar 中,而是在 jar 的清单中。我的评论不清楚,但我的回答是:-)。
    【解决方案4】:

    我认为您缺少类路径条目。

    您可能希望将 sql-driver 直接包含在类文件夹“fatjar”或“uberjar”中:http://one-jar.sourceforge.net/

    这将创建一个 jarfile,可以直接执行。

    【讨论】:

      【解决方案5】:

      你的主类 FecruDBreset 依赖于 com.microsoft.sqlserver.jdbc.SQLServerDataSource

      您应该在类路径中有 microsoft sql 驱动程序。

      所以你应该使用以下命令运行你的 jar

      java -jar myjar.jar -classpath {path_to_microsoft_jdbc_driver}

      【讨论】:

      • 引用之前的评论(但这次声音更大)“使用 -jar 选项运行时会忽略类路径。”
      猜你喜欢
      • 2013-06-23
      • 2021-03-20
      • 1970-01-01
      • 2011-12-27
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 2012-12-13
      • 2011-09-19
      相关资源
      最近更新 更多