作为jar的Java无法在子库

时间:2017-01-20 13:51:35

标签: java jar

我是Java的新手,遇到了让我感到困惑的问题。我有一个应用程序MyApp,我在IntelliJ中写道。该应用程序使用外部库MyLib.jar,它使用Microsoft的sqljdbc42.jar与数据库通信。 MyLib.jar和sqljdbc.jar都设置为IntelliJ中的外部库。

我遇到的问题是,当我在IDE中运行它时,我的应用程序运行得非常好,但是当我使用Generate Artifact来制作jar时,jar会在尝试连接数据库时出错。

错误:class java.lang.ClassNotFoundException | com.microsoft.sqlserver.jdbc.SQLServerDriver

这是sqljdbc42.jar中的一个类。我假设这意味着MyApp.jar无法在sqljdbc42.jar中看到类。

sqljdbc42.jar因其签名方式无法包含在MyApp.jar中。相反,我将文件放在与MyApp.jar相同的文件夹中,这是我的MANIFEST.MF:

Manifest-Version: 1.0
Class-Path: sqljdbc42.jar
Main-Class: com.mycompany.myapp.Main

这是文件布局:

- MyApp_jar/
  - sqljdbc42.jar
  - MyApp.jar

据我所知,我有另一个应用程序设置方式相同,并且.jar使用相同的类正常工作。

UPDATE - 我试图包含的.jar文件是一个签名的jar。我尝试包含的任何其他jar文件都可以正常工作。以下是要测试的示例应用:

import com.microsoft.sqlserver.jdbc.SQLServerDriver;
public class Main
{
public static void main(String[] args)
{
    try {
        System.out.println(SQLServerDriver.class);
    } catch (Exception e) {
        e.printStackTrace();
    }

}
}

这就是我无法上班的罐子:https://www.microsoft.com/en-us/download/details.aspx?id=11774(4.2版)

2 个答案:

答案 0 :(得分:0)

运行jar文件而不是类:

java -jar MyApp.jar

它应该将sqljdbc42.jar添加到类路径中。

答案 1 :(得分:0)

我从您的指定网址下载了存档sqljdbc_4.2.6420.100_enu.tar.gz,并提取了sqljdbc42.jar

以下步骤按预期工作

<强> Main.java

package com.mycompany.myapp;
import com.microsoft.sqlserver.jdbc.SQLServerDriver;
public class Main {
    public static void main(String[] args) {
        System.out.println(SQLServerDriver.class);
    }
}

<强> MANIFEST.MF

Manifest-Version: 1.0
Class-Path: sqljdbc42.jar
Main-Class: com.mycompany.myapp.Main

当前目录中的文件

Main.java
manifest.mf
sqljdbc42.jar

<强>编译

javac -d . -cp sqljdbc42.jar Main.java

创建类文件.\com\mycompany\myapp\Main.class

创建JAR

jar vcmf manifest.mf MyApp.jar com/

输出

added manifest
adding: com/(in = 0) (out= 0)(stored 0%)
adding: com/mycompany/(in = 0) (out= 0)(stored 0%)
adding: com/mycompany/myapp/(in = 0) (out= 0)(stored 0%)
adding: com/mycompany/myapp/Main.class(in = 466) (out= 321)(deflated 31%)

运行JAR

java -jar MyApp.jar

输出

class com.microsoft.sqlserver.jdbc.SQLServerDriver