में चलते समय कोई त्रुटि नहीं है। मैं जावा ऐप्स बनाने के लिए शुरू कर रहा हूं (मेरे पास .NET अनुभव है) और मैं एक छोटा परीक्षण ऐप बनाने की कोशिश कर रहा था जिसका पूरा कोड यह है:JAR चलाने पर ClassNotFoundException, IntelliJ IDEA
package com.company;
import com.microsoft.sqlserver.jdbc.SQLServerDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Main {
public static void main(String[] args) throws SQLException {
System.out.println("Buna lume!");
SQLServerDataSource ds = new SQLServerDataSource();
ds.setIntegratedSecurity(true);
ds.setServerName("localhost");
ds.setPortNumber(1433);
ds.setDatabaseName("Test");
Connection con = ds.getConnection();
String SQL = "SELECT * FROM Test WHERE ID = ?";
PreparedStatement stmt = con.prepareStatement(SQL);
stmt.setInt(1, 2);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt(1) + ", " + rs.getString(2));
}
rs.close();
stmt.close();
con.close();
}
}
यदि मैं आईडीई (इंटेलिजे आईडीईए 12.1.6 सामुदायिक संस्करण) में ऐप चलाता हूं, जिसमें SQL सर्वर उपलब्ध है, तो ऐप ठीक से चल रहा है जो इसे करना चाहिए।
SQL सर्वर ड्राइवर Microsoft से डाउनलोड किया गया है और एक बाहरी पुस्तकालय के रूप में जोड़ा गया है। मैं JAR फ़ाइल के रूप में एक विरूपण साक्ष्य बनाया है:
अब, अगर मैं cliTest.jar (मेरे जार) के परिणामस्वरूप JAR मोटा है (550kB में sqljdbc4.jar शामिल हैं और कि जार में वर्ग शामिल भी)। या मैं इसे बाहर कर सकते हैं। किसी भी तरह से,
Buna lume!
Exception in thread "main" java.lang.NoClassDefFoundError: com/microsoft/sqlserv
er/jdbc/SQLServerDataSource
at com.company.Main.main(Main.java:15)
Caused by: java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLSer
verDataSource
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 1 more
में चल
java -jar cliTest.jar
परिणाम मुझे यकीन है कि मैं कुछ काफी बुनियादी याद कर रहा हूँ, लेकिन मैं सिर्फ वास्तव में क्या यह हो रही है, नहीं कर सकते।
LE1: मैंने jq युक्त निर्देशिका में sqljdbc4.jar (हालांकि यह आवश्यक प्रतीत नहीं हुआ) और sqljdbc_auth.dll जोड़ने का प्रयास किया लेकिन अभी भी कोई बदलाव नहीं है।
बाद में संपादित करें 2: निकोले के जवाब के आधार पर मेरे द्वारा की गई है:
:
- मौजूदा विरूपण साक्ष्य
- बनाया गया तो जैसे एक नया विरूपण साक्ष्य नष्ट कर दिया गया
.. ए nd हुई इस:
बिल्ड -> बिल्ड कलाकृतियों -> cliTest.jar -> पुनर्निर्माण
- वाले फ़ोल्डर में
सीएमडी आदेश:
[cliTest.jar 566 KB जनरेट किया गया था]
जावा जार cliTest.jar
अब मैं मिलता है:
Exception in thread "main" java.lang.SecurityException: Invalid signature file d igest for Manifest main attributes at sun.security.util.SignatureFileVerifier.processImpl(Unknown Source) at sun.security.util.SignatureFileVerifier.process(Unknown Source) at java.util.jar.JarVerifier.processEntry(Unknown Source) at java.util.jar.JarVerifier.update(Unknown Source) at java.util.jar.JarFile.initializeVerifier(Unknown Source) at java.util.jar.JarFile.getInputStream(Unknown Source) at sun.misc.URLClassPath$JarLoader$2.getInputStream(Unknown Source) at sun.misc.Resource.cachedInputStream(Unknown Source) at sun.misc.Resource.getByteBuffer(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$100(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
यह एक तरीका है। लेकिन एक ही जार में प्रत्येक वर्ग फ़ाइल को एम्बेड करना भी काम करना चाहिए। ध्यान दें कि जार फ़ाइलें वास्तव में ज़िप फ़ाइलें हैं, इसलिए आप उन्हें हमेशा खोल सकते हैं और यह देखने के लिए अंदर देख सकते हैं कि उनमें सभी कक्षाएं हैं या नहीं। – lbalazscs
हां, मैंने आश्रित जेएआर (sqljdbc4.jar) में देखा है, लेकिन इसके परिणामस्वरूप इसे उत्पन्न करने की कोशिश कर रहा है JAR प्रश्न के अंतिम भाग में सुरक्षा अपवाद उत्पन्न करेगा। मुझे लगता है कि जेएआर को एम्बेड किया जा रहा था पर हस्ताक्षर किए गए थे और इसमें शामिल नहीं था ... या ऐसा कुछ। –
हां, यदि आप एक बड़े जार में हस्ताक्षरित जार की सभी फाइलें एम्बेड करते हैं, तो हस्ताक्षर समस्याएं पैदा कर सकता है। आप हस्ताक्षर से छुटकारा पाने के लिए मेटा-आईएनएफ/* एसएफ, मेटा-आईएनएफ/* डीएसए और मेटा-आईएनएफ/* आरएसए फाइलों को हटा सकते हैं। – lbalazscs