Hvad er den bedste måde at starte Java-programmer på Windows 7 på?

Indlæg af Hanne Mølgaard Plasc

Problem



Krav



Jeg vil gerne udgive en Java GUI applikation på Windows 7. Denne applikation bruger Swing Toolkit og behøver ikke nogen native kode. Programmet er installeret ved hjælp af en NSIS installer. Jeg vil integrere denne applikation i Windows 7 så godt som muligt . Dette betyder: [11]



  • Når programmet kører, skal det være muligt at pege applikationen på proceslinjen.

  • Det skal være muligt at knytte datafiler sammen med programmet, så Windows åbner disse filer med min ansøgning.

  • Skal automatisk arbejde med 32 bit Java Runtime og med 64 bit Java runtime. Så når brugeren afinstallerer en 32 bit Java og installerer en 64 bit Java i stedet (eller omvendt), så skal min ansøgning stadig arbejde.

  • Skal understøtte store skrifttyperindstillinger for Windows. Jeg forstår virkelig ikke denne funktion. Jeg ved bare, at nogle programmer ignorerer det helt, andre (som Google Chrome) er pixelskalede (ser virkelig grimme ud), og andre understøtter det ved blot at bruge større skrifttyper som beregnet (det er hvad Jeg vil og normalt fungerer det. Kun WinRun4J-løsningen nævnt nedenfor fungerer ikke med det).



Testede løsninger



WinRun4J



WinRun4j er en EXE-fil, der starter Java-applikationen. Da applikationen ikke gør en ny Java-proces, mener Windows, at EXE-filen er applikationen. Så der er ikke noget problem med proceslinjen. Filforeninger fungerer, fordi filerne simpelthen er forbundet med EXE-filen. [12]


Problemer:



  • understøtter ikke store skrifttyper. Applikationsvinduet er i stedet pixelskaleret (som Google Chrome).

  • To forskellige EXE-filer skal bruges afhængigt af den installerede JRE. Så når 64 bit JRE er installeret, skal applikationen startes med 64 Bit EXE filen. Når 32 bit JRE ins er installeret, skal den anden EXE bruges. Det er ikke brugervenligt, fordi brugeren ikke forstår hvorfor han skal bruge 32 bit EXE på et 64 bit operativsystem, når kun en 32 bit JRE er installeret.



Launch4J



Launch4J opretter en 32 bit EXE, der lancerer en ekstern Java-proces for at starte Java-applikationen. Så i modsætning til WinRun4J kan det også starte en 64 bit Java. [13]


Problemer:



  • Kan ikke tappe applikationen på proceslinjen.

  • System.out.println vil ikke udskrive til konsol, hvis headerType="gui", uanset om programmet startes fra konsollen.



JAR



På Windows kan du simpelthen dobbeltklikke på JAR-filen for at starte programmet. Installeret JRE gør ikke noget, fungerer bare. Men ...


Problemer:



  • Programmet kan ikke være fastgjort til proceslinjen.

  • Kan ikke oprette en genvej i startmenuen.

  • Kan ikke associere filer med en JAR-fil.



BAT/CMD



En simpel batchfil som denne kan bruges til at starte programmet:


@echo off
start c:windowssystem32javaw.exe -jar "c:program filesmyappmyapp.jar" \%1


Der kan oprettes en genvej til denne batchfil for at angive et brugerdefineret ikon.


Problemer:



  • Et DOS-vindue dukker op, når programmet startes.

  • Batchfilen ved ikke, hvor javaw.exe er placeret. Afhængigt af hvilken java-version (32 eller 64 bit) er installeret, kan den være placeret i c:windowssyswow64 i stedet, og Windows viderestiller ikke dette opkald fra batch filer automatisk. Brug af miljøvenuen JAVA\_HOME er også en no-go, fordi Java ikke indstiller dette automatisk.

  • Når der tilknyttes filer med batchfilen, kan der ikke indstilles et brugerdefineret ikon.

  • Aktivitetslinjestøtten fungerer ikke korrekt. Programmet kan fastgøres til det, når batchfilen startes manuelt, men når du dobbeltklikker på en tilknyttet fil i stedet, så virker det ikke 'arbejde'.



Genvej



I stedet for at bruge en batchfil er det kun muligt at oprette en genvej for at starte applikationen. Det linker til denne kommando: c:windowssystem32javaw.exe -jar "c:program filesmyappmyapp.jar". Windows omdirigerer automatisk dette opkald til SysWOW64-mappen, hvis der er installeret en 32-bit Java JRE.


Problemer:



  • Det er ikke muligt at tilknytte filer med det, fordi Windows kun accepterer EXE/COM/PIF/BAT/CMD-filer som associeringsmål. LNK-filer fungerer ikke.



Spørgsmål



Er der en anden løsning, der opfylder alle ovenstående krav? Eller er der nogle tricks til at løse problemerne med de nævnte løsninger?


Løsning



Efter løsningen af ​​proceslinjen-pinning problem ved hjælp af Launch4j ligner den bedste løsning. Launch4j kan nemt integreres i et Maven-projekt (med dette eller dette plugin), konfigurationen er temmelig let, og alt fungerer uden for boksen, undtagen proceslinjen. For opgavebjælke skal Java-applikationen indstille en appModelUserId som forklaret i svaret på dette spørgsmål. [14] [15] [16]


Derudover skal Java-applikationen installeres af et installationsprogram, som mindst skal installere en genvej, der peger på EXE. Denne genvej skal også indeholde appModelUserId. Med NSIS kan dette gøres med WinShell plugin og en konfiguration som denne: [18]


CreateShortCut "$SMPROGRAMSMyApp.lnk" 
    "$INSTDIRmyapp.exe" "" "$INSTDIRmyapp.exe" 0 SW\_SHOWNORMAL
WinShell::SetLnkAUMI "$SMProgramsMyApp.lnk" "MyAppModelUserId"


Af en eller anden ukendt grund må denne genvej kun eksistere. Du behøver ikke at bruge det Du kan dobbeltklikke på EXE og proceslinjespindning, der stadig fungerer. Du kan endda oprette genvejen i en del undermappe i din applikationsmappe. Opgavestiften stopper med at fungere, når den sidste genvej af EXE-filen fjernes.

Bedste reference


Prøv Launch4j (http://launch4j.sourceforge.net/), det er en simpel jar til exe wrapper (faktisk indpakning af krukken er valgfri). Det skal løse dine ikoner og proceslinje krav. Det er også i stand til at finde installerede JRE'er (nogle konfigurerbare regler). Skrifttypeproblemet jeg ikke får nok, skal Swing automatisk bruge skrifttyper afhængigt af Windows-indstillinger, medmindre du på en eller anden måde overskriver det i JRE-indstillingerne eller i kode.]] [20]

Andre referencer 1


Java Web Start - Jeg ville ikke overveje at distribuere en ansøgning nogen anden måde, disse dage. [21]


Brugeren skal mindst have J2SE 1.4; Hvis dine applikationer har brug for en senere version, downloader Web Start automatisk en passende JRE.


Se JNLP-referencen til tags til desktop integration (shortcut og offline-allowed) og filforeninger (association). Disse understøttes kun i WS 1.5. [22]

Andre referencer 2


Jeg personligt bruger Launch4j (gennem maven med maven-launch4j-plugin for at være endnu mere præcis), og jeg implementerer systembakkehåndtering fra min ansøgning ... (Se http://java. sun.com/developer/technicalArticles/J2SE/Desktop/javase6/systemtray/).[23]

Andre referencer 3


Jeg har haft god succes med WinRun4J samlet, men jeg har ikke gjort meget med skrifttyper, så jeg vil indrømme, at jeg ikke er sikker på, at jeg forstår, hvorfor du har det problem du beskriver der.


Men hvad du beskriver, lyder det som om du har meget specifikke krav fra en Java native launcher. Hvorfor ikke bare skrive din egen? Du kan starte med noget som WinRun4J (som er open source, licenseret under Eclipse CPL) og bare ændre det til dine behov.


Alternativt kan du se på de native launchers, der bruges af andre programmer. Eclipse og NetBeans launchers synes begge at fungere ret godt, og begge er open source. Du kan måske også nemt tilpasse en af ​​dem.

Andre referencer 4


Som en side, skal du også tjekke den nye funktion for at få din app i værktøjsraden/systemtray:


Oracle har en vejledning om, hvordan man bruger systembakken. [24]


Det er Java SE 6 relateret .... får mig også at vinde, hvad andre goodies kan være i den nyere Java 7?