PDA

Επιστροφή στο Forum : Βοήθεια για Java Exception σε εφαρμογή NetBeans 6.8



thanos45
04-02-10, 12:19
1)
Έχω δημιουργήσει μία εφαρμογή που χρησιμοποιεί (μέσα από ODBC) μία βάση δεδομένων
Access.Η εφαρμογή δημιουργήθηκε μέσα σε περιβάλλον NetBeans (αρχικά version 6.7 και 6.7.1 και τώρα 6.8) Ενώ λοιπόν η εφαρμογή δεν έχει κάποιο λάθος και έτρεχε κανονικά μέσα στον NetBeans ξαφνικά ενώ προσπαθώ να την τρέξω (run) παίρνω την παρακάτω εξαίρεση:


run:
java.lang.UnsupportedClassVersionError: dentist_trial_test/Main : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:637)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:280)
at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:215)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:208)
at java.lang.ClassLoader.loadClass(ClassLoader.java:323)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:336)
Error: Could not find the main class.
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" Java Result: 1
BUILD SUCCESSFUL (total time: 2 seconds)

απ ότι καταλαβαίνω (αν καταλαβαίνω και σωστά ) δεν πρέπει να βρίσκει την main class η οποία όμως υπάρχει.
Τί θα πρέπει να αλλάξω στις ρυθμίσεις για να τρέξει?

2)
Επίσης σε κάποιο σημείο χρησιμοποιώ τον τύπο δεδομένων:
Vector<Cector<String>> δηλαδή ένα πίνακα τύπου Vector<String> που έχει ωσ στοιχεία
άλους πίνακες γραμμές Vector<String>>.
Όταν λοιπόν κάποια στιγμή (και πριν την παραπάνω εξαίρεση) έτρεχα το πρόγραμμα μέσα από τον NetBeans (και όχι απ το jar αρχείο) έτρεχε κανονικά και μου εμφάνιζε τα δεδομένα που είχα αποθηκεύσει στο Vector<Vector <String>> , όταν όμως το έτρεχα απ το jar δεν τα εμφάνιζε γεγονός που σημαίνει ότι για κάποιο λόγο δεν πρέπει να έχουν φορτωθεί στο δημιουργημένο project οι απαραίτητες βιβλιοθήκες (απαιτείται να τρέχει αν θυμάμαι καλά σε JDK-6 ή μεταγενέστερο προκειμένου να αναγνωρίσει αυτόν το τύπο δεδομένων Vector<Cector<String>> ).
Τι θα πρέπει να κάνω στις ρυθμίσεις και πριν πατήσω Clean and Bluild στο NetBeans για την δημιουργία του jar αρχείου προκειμένου να τρέχει απ το jar κανονικά?

σας ευχαριστώ πολύ

virxen
04-02-10, 12:41
στο command prompt γράψε αυτό

java -version

να δεις τι έκδοση java έχεις

thanos45
04-02-10, 13:52
Microsoft Windows XP [Έκδοση 5.1.2600]
(C) Πνευματικά δικαιώματα 1985-2001 Microsoft Corporation

έχω την 1.7 όπως φαίνευται και παρακάτω

java version "1.7.0-ea"
Java(TM) SE Runtime Environment (build 1.7.0-ea-b24)
Java HotSpot(TM) Client VM (build 12.0-b01, mixed mode, sharing)

dvm
04-02-10, 18:56
Το UnsupportedClassVersionError σου λέει ότι το jvm βρίκσει μια κλάσση που δεν υποστηρίζει την έκδοσή της. Στο netbeans έχεις βάλει να κάνει build με javac 1.7 μάλλον, αλλά πας να την τρέξεις με java 1.6 (ή ίσως και το αντίθετο). Πρόσεξε ποιό jdk χρησιμοποιεί το netbeans και να πας να το τρέξεις με το ίδιο και μόνο του.

ΥΓ: Γιατί να χρησιμοποιήσεις 1.7; Χρειάζεσαι κάποιο από τα νέα features; Δεν έχει βγει ακόμα, είναι σε beta απ'όσο ξέρω.

virxen
04-02-10, 19:20
δοκίμασε από το μενού run του netbeans να τρέξεις
το clean and build main project.

nikospara
04-02-10, 20:51
Το UnsupportedClassVersionError σου λέει ότι το jvm βρίκσει μια κλάσση που δεν υποστηρίζει την έκδοσή της. Στο netbeans έχεις βάλει να κάνει build με javac 1.7 μάλλον, αλλά πας να την τρέξεις με java 1.6 (ή ίσως και το αντίθετο). Πρόσεξε ποιό jdk χρησιμοποιεί το netbeans και να πας να το τρέξεις με το ίδιο και μόνο του.

Το Exception δείχνει ακριβώς αυτό. Δές από Tools->Java Platforms τι γίνεται. Δές και στο PATH τι γίνεται, δηλ με ποια σειρά είναι δηλωμένα τα JREs.


ΥΓ: Γιατί να χρησιμοποιήσεις 1.7; Χρειάζεσαι κάποιο από τα νέα features; Δεν έχει βγει ακόμα, είναι σε beta απ'όσο ξέρω.

Και αυτό πρόσεξε.


δοκίμασε από το μενού run του netbeans να τρέξεις
το clean and build main project.

Κάντο και αυτό που είναι γρήγορο.

thanos45
04-02-10, 23:26
Το clean and build δεν δουλεύει ...
κάποια στιγμή όμως δούλεψε όταν αλλαξα σε JDK 6
στο Properties/Sourse binary format= JDK 6 και αντίστοιχα:
tools/java platforms:JDK 1.6 που σημαίνει ότι είχες δίκιο φίλε μου
αλλά δεν λειτουργεί σωστά το jpopup menu που έχω ενσωματώσει σε κάποια κλάση
επίσης έχω συμπεριλάβει και δεδομένα που φορτώνονται σε Vector<Vector<String>>
και κάποια στιγμή νομίζω ότι μου ζητούσε ως απαραίτητο το JDK 6 ή νεώτερο γιαυτό και είχα επιλέξει το JDK 7.

Επίσης θα ήθελα με την ευκαιρία αν κάποιος γνωρίζει να με πληροφορίσει πως θα χρησιμοποιήσω το jar αρχείο.
Δηλαδή αφού κατασκευάσω το project εκτός απ τη βάση δεδομένων σε Access που χρησιμοποιεί τι άλλο θα πρέπει να παραδώσω σε ένα φίλο μου που θα το
χρησιμοποιήσει ?
Αρκεί μόνο το jar αρχείο ή πρέπει να του δώσω όλο το φάκελο με το project που δημιουργεί ο NetBeans στο φάκελο NetBeansProjects στα Έγγραφά μου και περιέχει στο "dist" φάκελο το jar αρχείο?

και πάλι σας ευχαριστώ πολύ παιδιά.

dvm
05-02-10, 12:37
Αν χρησιμοποιείς και κάποια άλλα jar (που λογικά θα χρησιμοποιείς, πχ jdbc drivers για την access) αυτά τα δηλώνεις στο MANIFEST.MF (Class-Path). Απλά εκεί θέλει προσοχή πως θα τα δηλώσεις. Αν θυμάμαι καλά παίρνει μόνο relative path και όχι absolute. Οπότε μια λογική δομή θα ήταν:



[distribution directory]
MyApplication.jar
[lib directory]
mydriver.jar
anotherlib.jar
mydb.mdb


Και στο Manifest βάζεις μεταξύ άλλων: Class-Path: lib/mydriver.jar lib/anotherlib.jar
Ελπίζω να κατάλαβες πως λειτουργεί περίπου. Άνοιξε και κανένα υπάρχον jar να δεις πως είναι μέσα το manifest.mf (META-INF directory).

thanos45
05-02-10, 17:16
Η αλήθεια είναι ότι δεν γνωρίζω αρκετά πράγματα για τον τρόπο λειτουργίας της Java ούτε επίσης και για το NetBeans και τις δυνατότητές του ...πριν από χρόνια είχα ασχοληθεί με το JBuilder με κάποια projects...
Στο project που δημιούργησα η εφαρμογή επικοινωνεί με το αρχείο της Access μέσω ODBC.
Είδα όμως τελευταία ότι υπάρχει η δυνατότητα δημιουργίας τόσο μιας βάσης δεδομένων όσο και της σύνδεσής της με την εφαρμογή μέσα από περιβάλλον NetBeans και θα ήθελα να το ψάξω λίγο περισσότερο γιατί μου φαίνεται αρκετά ενδιαφέρον.
Οπότε θα επανέλθω με ερωτήματα και απορίες πιό συγκεκριμένες.

Τώρα αυτό που με απασχολεί είναι το εξής:
Πώς θα διασφαλήσω τον κώδικα ούτως ώστε να μην είναι προσπελάσιμος απ τον χρήστη της εφαρμογής.
Είδα ότι το jar αρχείο αποσυμπιεζόμενο εμφανίζει τα πακέτα με τα αρχεία της εφαρμογής.
Δεν ξέρω όμως αν κάποιος μπορεί να τα διαβάσει στη μορφή αυτή.
Τι κάνω για να μην μπορεί κάποιος να αποσυμπιέσει το jar αρχείο?
Και γενικότερα αν υπάρχει δυνατότητα να κλειδώσω με κωδικό τόσο το jar όσο και ότι άλλο θα παραδώσω.
(Στην Access ξέρω βάζω κωδικό χρήστη και password με το jar τι γίνεται?)

ευχαριστώ πολύ

dvm
05-02-10, 18:59
To jar δεν κλειδώνει ρε συ. Αν δεν μπορεί να το ανοίξει κάποιος πώς θα το ανοίξει η ίδια η java να το τρέξει; Μέσα δεν περιέχει ακριβώς τον κώδικά σου, αλλά τα .class files που είναι bytecode για τα jvm.
Αυτά μπορείς να τα διαβάσεις με κάποιο decompiler όπως ο cavaj. Α αυτό μόνο για τα .java αρχεία. Ότι είναι xml, jsp μπορεί να το διαβάσει οποιοσδήποτε από το jar.

Αν φοβάσαι να μην δουν τον κώδικά σου ψάξε για code obfuscators, αλλά προσωπικά δεν συμφωνώ με την χρήση του. Η ασφάλεια μιας εφαρμογής έγκειται στον καλό σχεδιασμό, όχι στην απόκρυψη κώδικα.

thanos45
05-02-10, 20:08
φίλε μου σε ευχαριστώ πολύ για τις συμβουλές σου...
απ ότι κατάλαβα παραδίδω μόνο ότι είναι σε jar(συν το αρχείο access).
(αφού φάκελος "lib" μέσα στο "dist" με άλλα jar δεν υπάρχει σε αυτό το project μου).

dvm
06-02-10, 04:04
Τίποτα ρε συ.
Όχι lib δεν θα ήταν μέσα στο jar αλλά έξω από αυτό. Φαντάσου το αν ξέρεις όπως τα dll των windows. Ένα πρόγραμμα δεν ξανα-ανακαλύπτει τον τροχό, αλλά συνήθως χρησιμοποιεί βιβλιοθήκες. Αυτές τις βιβλιοθήκες πρέπει κάπου να τις βρει. Όμως όταν τρέχεις το java με -jar είναι λίγο δύστροπο και δεν μπορεί να του δώσεις command line το -classpath πρέπει να τα δηλώσεις στο MANIFEST.MF. Εκεί αν θυμάμαι καλά δέχεται μόνο relative path και όχι absolute.

Αν και δεν πολυχρησιμοποιώ netbeans δες στο project σου, αν έχει δηλωμένα κάποια άλλα jar για να γίνει build και να τρέξει. Αυτά θα σου χρειαστούν όταν πας να τρέξεις το jar μόνο του και θα πρέπει το jar να μπορεί να τα βρει.
Πχ μια άλλη μέθοδος είναι να κάνεις unzip τις κλάσσεις και να τις πακετάρεις μαζί με τον κώδικά σου μέσα στο jar. Αλλά νομίζω ότι να τα δηλώσεις στο MANIFEST.MF είναι πιο εύκολο.

@ ADSLgr.com All rights reserved.