Avatar billede hono Nybegynder
09. april 2005 - 22:44 Der er 32 kommentarer og
2 løsninger

Køre javaapplikation

Jeg har lavet et GUI-javaprogram. Jeg bruger i programmet nogle pakker der ikke er en del af af standard API'en. Jeg vil gerne have at programmet kan køres på alle computere der har java installeret, uden de behøver downloade de ekstra pakker jeg bruger i programmet.

Jeg vil også meget gerne have, at programmet bliver kørt lige så snart man dobbeltklikker på .class-filen.

Kan dette lade sig gøre?

På forhånd tak

Hono
Avatar billede arne_v Ekspert
09. april 2005 - 22:48 #1
Standard java måden at gøre det på er:

1)  pak alle dine .class filer i en enkelt .jar fil
2)  put et manifest i den .jar fil med et Main-Class direktiv som peger
    på din main class og et Class-Path direktiv som peger på de .jar filer
    du skal bruge
3)  distribuer din .jar fil og de eksterne .jar filer sammen

så kan folk dobbelt klikke på din .jar fil og det hele kører
Avatar billede kalp Novice
09. april 2005 - 22:49 #2
hmmm tænker du på en Jar fil? eller exe fil? du skal stadig lave en jar fil først

http://www.ej-technologies.com/products/exe4j/overview.html

exe
Avatar billede hono Nybegynder
09. april 2005 - 22:57 #3
Hmm, det er vist fint nok det med jar-filerne, det behøver ikke være .exe.

Jeg kunne dog godt tænke mig lidt hjælp til hvordan de 3 skridt arne_v opremser rent praktisk foretages - for det er mere eller mindre russisk for mig :)

For det første, hvordan får jeg overhovedet pakket mine filer som en .jar-fil?

Hono
Avatar billede arne_v Ekspert
09. april 2005 - 22:59 #4
Der er en jar utility i JDK (og de fleste IDE'er kan også gøre det)

Du skal nok lige bruge 20 minutter på:
  http://java.sun.com/docs/books/tutorial/jar/
Avatar billede hono Nybegynder
09. april 2005 - 23:02 #5
Okay, takker for linket. Kigger på det. Kan være der kommer nogle flere spørgsmål om lidt når jeg har fået tygget mig igennem det.

Hono
Avatar billede hono Nybegynder
09. april 2005 - 23:19 #6
arne_v >> Okay, nu skulle jeg være i stand til at pakke mine filer som en .jar-fil og lave en Main-Class der peger på min main class.

Når du skriver "eksterne jarfiler", mener du så den ekstra-pakke jeg har brugt i mit program? Og den Class-Path du taler om, skal den bare angives på samme måde som jeg angiver min Main-Class?
Avatar billede arne_v Ekspert
09. april 2005 - 23:27 #7
ja + ja
Avatar billede arne_v Ekspert
09. april 2005 - 23:27 #8
Jeg formoder at du har dine "extras" i form af en jar fil
Avatar billede hono Nybegynder
09. april 2005 - 23:45 #9
Jeps, det har jeg også.

Er dog løbet ind i et lille problem. Jeg har gjort som følger:

1. Lavet en fil ved navn "Manifest.txt" og placeret det i samme mappe som de filer jeg vil pakke. Filen har følgende indhold:

Main-Class: NinControl.SerielProgram.class
Class-Path: comm.jar

2. Jeg forsøger at pakke mine filer ved at skrive følgende:

jar cmvf Mainfest.txt NinControl SerielProgram.class KontrolPanel.class

Men af en eller anden grund kan den ikke finde min Manifest.txt-fil og skriver følgende:

java.io.FileNotFoundException: Manifest.txt


Er der nogen logisk forklaring på dette?

Hono
Avatar billede arne_v Ekspert
09. april 2005 - 23:46 #10
Main != Mani

måske
Avatar billede hono Nybegynder
09. april 2005 - 23:53 #11
Nej, desværre. Det var en fejl der sneg sig ind da jeg kopierede teksten herind. Det var ikke det jeg skrev i virkeligheden, så det er ikke der fejlen er :(

Skal lige siges at jeg godt kan pakke filerne hvis jeg undlader alt det med Manifest.txt-filen. Men så kan jeg jo ikke få angivet min Main-Class og Class-Path. Eller der er måske en anden måde?
Avatar billede hono Nybegynder
10. april 2005 - 00:56 #12
Så, nu er det lykkedes mig at få pakket jarfilen og få angivet både main-class og class-path. Men der er desværre flere problemer :(

Når jeg forsøger at køre mit program med kommandoen:

java -jar NinControl

Får jeg følgende fejlmeddelelse:

Exceptioon in thread "main" java.lang.NoClassDefFoundError in NinControl/SerielProgram

For at tjekke om det er min kode er noget galt med lavede det mest simple program jeg kunne tænke mig:

public class test{
public static void main(String[] args){
System.out.print("Hello world");
}
}

Dette forsøgte jeg at pakke som en jar-fil på tilsvarende måde og fik igen samme fejl.

Hvad gør jeg galt?

Hono
Avatar billede mikkelbm Nybegynder
10. april 2005 - 01:01 #13
Ligger manifestfilen i samme mappe som det du vil pakke i jar-filen?

Normalt når jeg laver jar-filer har jeg en struktur a la:

<mapper>
classes    (alle klasserne)
doc        (dokumentation)
META-INF  (indeholder manifest)

og så vil din kommando se nogenlunde sådan her ud:

jar cmvf META-INF/Mainfest.txt NinControl.jar *.class
Avatar billede jara06 Nybegynder
10. april 2005 - 01:02 #14
ingen ide, har ikke fulgt spm, men måske det her kan hjælpe en smule .. :)
http://www.eksperten.dk/spm/319073
Avatar billede mikkelbm Nybegynder
10. april 2005 - 01:05 #15
Der er faktisk en vigtig detalje mht jarfiler. Jeg ved ikke om det er et problem når man kører fra kommandoprompt med kommandoen -jar, men jeg ved det er et problem, hvis man vil kunne dobbeltklikke på filen.

Husk!
Linjeskift efter sidste linje i manifestet.
Avatar billede mikkelbm Nybegynder
10. april 2005 - 01:09 #16
Og dit manifest skal nok være:

Main-Class: NinControl.SerielProgram
Class-Path: comm.jar

uden .class
Avatar billede arne_v Ekspert
10. april 2005 - 09:09 #17
Og strukturen inde i har file skal matche pakke strukturen.

NinControl/SerielProgram skal ligge som NinControl/SerielProgram.class

(kan checkes med jar tvf)
Avatar billede hono Nybegynder
10. april 2005 - 15:37 #18
Jeg har fået det pakket nu, og programmet kan køres når man dobbeltklikker på jar-filen. Men der er tilsyneladende noget galt med Class-Path'en.

Mit program benytter comm-api som bl.a. kan bruges til seriel kommunikation. En af mine metoder sørger for at navnene på alle computerens serielporte bliver skrevet på skærmen. Det virkede fint da jeg udviklede programmet i JCreator, men nu finder den pludselig ingen porte. Det er ligesom om comm-api'en ikke virker. Jeg har ellers lavet filen comm.jar i samme mappe som min egen jar-fil. Og programmet "brokker" sig da også hvis jeg fjerner filen derfra, så den kan altså godt se at den er der.

Er der mere jeg skal gøre for at kunne benytte comm-api'en i mit program? Skal jeg fx angive at comm er del af javax-pakken? I min kode bruger jeg jo kommandoen "import javax.comm.*" for at importere comm-api'en.

Nogle bud på hvad problemet er?

Hono
Avatar billede arne_v Ekspert
10. april 2005 - 15:40 #19
Er COMM pure java eller hører der nogle native DLL'er med ?
Avatar billede hono Nybegynder
10. april 2005 - 15:48 #20
DEr hører vist DLL'er med. Jeg skulle i hvert fald kopiere filen "win32com.dll" ind i en mappe da je installere comm-api'en. Desuden skulle jeg kopiere filen javax.comm ind i en mappe.

Skal disse filer også ligge i samme mappe som min jar-fil? Og skal de også tilføjes til Class-Path'en?

Hono
Avatar billede arne_v Ekspert
10. april 2005 - 15:50 #21
win32com.dll skal med så

og prøv først om samme dir er nok
Avatar billede hono Nybegynder
10. april 2005 - 15:55 #22
Det virker stadig ikke :( Heller ikke selvom jeg tilføjer det til min class-path. Har skrevet følgende i min Manifest.txt-fil:

Main-Class: SerielProgram
Class-Path: comm.jar win32com.dll
Avatar billede arne_v Ekspert
10. april 2005 - 15:57 #23
en DLL skal ikke i Class-Path

prøv og smid den DLL et sted som er i PATH
Avatar billede hono Nybegynder
10. april 2005 - 17:30 #24
Nu har jeg prøvet følgende:

Main-Class: SerielProgram
Class-Path: comm.jar
Path: win32com.dll

Det virker heller ikke. Var det det du mente?
Avatar billede arne_v Ekspert
10. april 2005 - 17:32 #25
Nej.

PATH environment variabel

Enten tilføj det dir hvor DLL Ligger til PATH eller smid den et sted
som C:\WINDOWS\SYSTEM32
Avatar billede hono Nybegynder
10. april 2005 - 17:40 #26
hmm, er ikke helt sikker på at jeg er med. Nu har jeg placeret min dll-fil i en mappe jeg kalder "DLL" og skrevet følgende:

Main-Class: SerielProgram
Class-Path: comm.jar
Path: DLL

Det virker ikke, men har også på fornemmelsen det ikke var det du ville have mig til...?
Avatar billede mikkelbm Nybegynder
10. april 2005 - 17:42 #27
PATH er:

Højreklik på denne computer >> Egenskaber >> Avanceret >> Miljøvariabler >> Path
Avatar billede arne_v Ekspert
10. april 2005 - 17:42 #28
Korrekt jeg snakker om PATH environment variabel.

control panel
system
advanced
environment
PATH
Avatar billede arne_v Ekspert
10. april 2005 - 17:42 #29
[og husk tilføj til ikke erstat eksisterende !!]
Avatar billede arne_v Ekspert
26. april 2005 - 00:11 #30
hono>

Har du fået løst problemet ?
Avatar billede hono Nybegynder
12. maj 2005 - 23:19 #31
Nej, det har jeg faktisk ikke. Men det er vist langt over lukketid. Så kom med nogle svar arne_v og mikkelbm, så får I point

Takker for hjælpen

Hono
Avatar billede mikkelbm Nybegynder
13. maj 2005 - 00:35 #32
svar...

(husk  at vente på arne_v - jeg får ingen mails for tiden, så det var rent held at jeg faldt over denne tråd igen :)
Avatar billede arne_v Ekspert
13. maj 2005 - 11:32 #33
ditto

(mails er dog lige startet igen)
Avatar billede hono Nybegynder
14. maj 2005 - 22:52 #34
Takker for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester