我是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版)
答案 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