Avatar billede kkaen Nybegynder
13. oktober 2008 - 07:06 Der er 28 kommentarer og
1 løsning

Køre java på fil gennem wpf

Jeg har en fil, som jeg gerne vil uploade til en server i wpf. Før filen bliver overført til serveren, vil jeg dog gerne behandle den aktuelle fil gennem et java-program/java-kommando. Java-kommandoen modificerer filen, hvorefter den overføres til serveren. Men hvordan eksekverer man en java-kommando gennem wpf? Jeg vil naturligvis gerne vise for brugeren, at filen behandles af java'en, og dertil ville det være ideelt, hvis der dertil bliver vist en såkaldt "progressbar" fra wpf. Men hvordan bliver sådan en progressbar sat sammen med dette java-program, samt hvordan får man sådan en midlertidig progressbar til at ligge "øverst" på GUI'en?
Avatar billede arne_v Ekspert
13. oktober 2008 - 22:16 #1
WPF er vel kun GUI delen.

Men andre dele af .NET kan starte et eksternt program - Process klassen (i System.Diagnostics namespace)
har en Start metode som kan bruges.

At se hvor langt det er kommet er mere tricky. Skriver Jav aprogramet noget om hvor langt det
er kommet ?
Avatar billede kkaen Nybegynder
13. oktober 2008 - 22:55 #2
Huha, jeg ved faktisk ikke lige p.t., om filbehandlingen giver en løbende oversigt over dens fremgang. Jeg tænkte blot på den "progressbar", som så kunne tage vare på det hele. Men det er nok vigtigt, at jeg lige finder ud af, om der er løbende output fra processen.

Nu du siger det, så kan jeg godt huske den Process-klasse. Og den burde vel også kunne køre en java-kommando. Jeg var blot forblændet af tanken om en bat-fil, som kunne klare det. Men det er vel et lævn fra gamle dage, når man snakker .Net.
Avatar billede arne_v Ekspert
13. oktober 2008 - 23:14 #3
Du kan godt køre en BAT fil som kører java.exe, men lige umiddelbart kan jeg ikke se
hvad BAT filen giver fremfor at køre java.exe direkte.
Avatar billede kkaen Nybegynder
14. oktober 2008 - 09:31 #4
Mht. output fra java-programet, så giver det dette:

Parent: com.sun.xml.fastinfoset.sax.SAXDocumentSerializer@a4488
chars: 1 tot: 0
chars: 1 tot: 1
chars: 1 tot: 2
chars: 1 tot: 3
chars: 1 tot: 4
chars: 1 tot: 5
chars: 1 tot: 6
chars: 1 tot: 7
chars: 1 tot: 8
chars: 1 tot: 9
chars: 1 tot: 10
chars: 2 tot: 11

Jeg ved ikke, om det er noget, der kan bruges til at vise, hvor langt programet er nået?
Avatar billede kkaen Nybegynder
14. oktober 2008 - 16:50 #5
Forresten så kræver dette java-program, at det ekserkveres i installationsbiblioteket. Nu er jeg ikke helt klar over, hvor wpf-applikationer ekserkveres henne (i dets bibliotek eller i windows\temp), men er det ellers ikke muligt, at man sætter classpath'en op, så java-programet kan køres alle steder? Hvis man kan det, kan den så sættes op gennem .Net's process-klasse ?
Avatar billede arne_v Ekspert
14. oktober 2008 - 17:37 #6
Man kan koere et Java program fra et hvilkert som helst dir hvis man angiver en
passende -cp parameter til java kommandoen.
Avatar billede arne_v Ekspert
15. oktober 2008 - 02:44 #7
Hvis du ved hvad det output betyder, så kan du bruge det. Du kan godt læse output
fra det program du kører.
Avatar billede kkaen Nybegynder
15. oktober 2008 - 10:21 #8
14/10-2008 17:37:41
Det lyder godt. Men jeg har netop fået den gode ide, at jeg gerne vil køre java-programet gennem en webservice (faktisk en WCF-applikation). Kan det så også lade sig gøre? Det burde det vel, men hvordan gøres det så i praksis?

Så er det vel også på det netsted, hvor wcf'en ligger, hvor det omtalte output fra java-programet bliver genereret (eller gøres det lokalt via referencer til outputet fra wcf-servicen). Skal man så også lave nogle metoder, som sender det output til klienten, så der kan genereres en progresbar ved klienten?
Avatar billede arne_v Ekspert
16. oktober 2008 - 02:28 #9
Præcis på samme måde. En WCF burde ikke være anderledes i den henseende.

Progressbar bliver ikke nemmere af at lave det som web service. Så skal du have en
separat web service der kaldes for at hente progress status.
Avatar billede arne_v Ekspert
27. oktober 2008 - 03:17 #10
kommet videre ?
Avatar billede kkaen Nybegynder
27. oktober 2008 - 17:07 #11
Beklager; men nej. Jeg har også oprettet:
http://www.eksperten.dk/spm/848856
og den skal jeg først have styr på, før jeg kan køre et java-program på filen. Men jeg prøver nok snart at køre dette java under alle omstændigheder...
Avatar billede kkaen Nybegynder
28. oktober 2008 - 14:39 #12
Nu er jeg kommet et godt stykke videre i processen. Jeg mangler blot at kunne gemme et objekt/fil på en IIS7-server. Og ud fra mit kendskab til arne_v's viden i andre spørgsmål herinde, så vil jeg tro, at det er noget du også kender til?
Objektet som IIS7 modtager er en fil.
Avatar billede kkaen Nybegynder
02. november 2008 - 16:25 #13
Nu har jeg løst problemet med at gemme en fil på serveren. Så nu skal det omtalte java-program køres. I mine forsøg på det, har jeg fundet ud af, at det ikke er et javaprogram, som skal kaldes gennem Process.start(). Det er den bat-fil, som skal kaldes derigennem. Problemet er så, at den bat-fil skal køres med argumenter - f.eks. "program.bat originalFil.* modificeretFil.*".
Skal fil-argumenterne så ind i Process.Start() som argumenter som i Process.Start("program.bat", "originalFil", "modificeretFil"), eller hvordan opnår jeg det ønskede?
Avatar billede kkaen Nybegynder
02. november 2008 - 16:41 #14
Ah, det skal vel gøres mere skridt for skridt.

Nu har jeg lavet dette:

Process p = new Process();
p.StartInfo.FileName="c:\\Programmer\\program.bat";
p.StartInfo.Arguments = "c:\\Temp\\originalFil.* c:\\Temp\\modificeredeFil.*";
p.Start();

Men for det første, så virker dette ikke. For det andet, så bliver programet godt nok kørt, men det kommer hurtigt frem i et console-vindue, hvorefter console-vinduet hurtigt lukkes igen, så man ikke kan se eventuelle fejlmeddelelser. Findes der en måde hvorpå, dette nye console-vindue kan holdes åbent, så jeg har mulighed for at debug'e?
Avatar billede arne_v Ekspert
02. november 2008 - 18:11 #15
put en PAUSE nedest i bat filen
Avatar billede kkaen Nybegynder
03. november 2008 - 20:21 #16
Ja, nu kan jeg da se, hvad der sker i processen.

Den første fejlmeddelelse lyder:

Exception in thread "main" java.lang.NoClassDefFoundError: program/converter/extension
Caused by: java.lang.ClassNotFoundException: program.converter.extension
        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 java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: program.converter.extension.  Program will exit.
Press any key to continue . . .

Jeg har testet kommandoen manuelt i prompten, og her virker det ikke, når jeg står i roden. Men når jeg står i det korrekte bibliotek, så virker det fint. Derfor prøvede jeg, at sætte process.startInfo.workingDirectory=bilioteket. Men det virkede ikke.

Så jeg prøvede, at gribe det an fra en anden vinkel. Bat-filen skal køres "bat-fil fil-argument1 fil-argument2". Det skrev jeg blot ind som en hel linie i første forsøg. I dette forsøg bruger jeg process.startInfo.arguments="sti til fil-argument". Og endnu engang til fil#2: process.startInfo.arguments="sti til fil-argument". Hey...jeg fik lige den ide, at skrive begge argumenter ind i første linie...og nu virker det ;-)

Nu bliver næste skridt i processen så at få alt dette kaldt fra en wpf-applikation med fil-argumenter valgt i en fileDialog...
Avatar billede arne_v Ekspert
03. november 2008 - 20:58 #17
Kan du ikke sætte classpath explicit ?

java -cp C:\some\dir ...
Avatar billede kkaen Nybegynder
03. november 2008 - 22:09 #18
Det har jeg ikke rigtigt undersøgt endnu. Hvad vil jeg kunne få ud af det? Applikationen skal jo aligevel vide, hvor den java-fil er blevet installeret under installation af hele applikationen. Og om man holder styr på dén sti, eller om man blot skriver hele default-stien ind i applikationen, giver vel nærmest det samme i sidste ende?
Desuden skal jeg jo også holde styr på, i hvilket bibliotek kommandoen bliver udført/hvor outputtet bliver gemt.
Avatar billede arne_v Ekspert
03. november 2008 - 22:12 #19
Fejlen er at den ikke kan finde Java programmet.

-cp fortæller java hvor Java programmet er.

Default directory er ikke velegnet til det formål.
Avatar billede kkaen Nybegynder
04. november 2008 - 09:46 #20
Men hele java-problematikken er ude af billedet nu, hvor det hele klares via bat-filen. Hvis det ikke klares via bat-filen, så skal jeg også til at sætte mig ind i alle kaldene til diverse klasser inde i bat-filen.
Avatar billede arne_v Ekspert
04. november 2008 - 13:03 #21
Nej. Du skal bare sætte en enkelt -cp ind i java kommandoen i bat-filen !
Avatar billede kkaen Nybegynder
05. november 2008 - 21:14 #22
Men så skal man vel køre bat-filen 1 enkelt gang, før systemet kender informationerne? Og denne proces skal vil til, for at bat-filen efterfølgende kan kaldes fra alle bibliotekker (hvis jeg har forstået det rigtigt) ?
Avatar billede arne_v Ekspert
06. november 2008 - 04:20 #23
Jeg er lidt forvirret. Ved du ikke hvor både BAT og CLASS/JAR filerne er ?
Avatar billede kkaen Nybegynder
06. november 2008 - 12:11 #24
Jeg ved, hvor bat-filen er. Jeg har været inde i den fil, og det ser ud som om, at der er kald til jar-filerne derinde fra.

Her er udsnit fra bat-filen:

java  -Xmx450M -Xbootclasspath/p:./bin -Dsun.java2d.noddraw=true -Djava.library.path=./bin -classpath .;apps/converter/program.jar;jars/vecmath.jar;jars/gt2-main.jar;jars/geoapi.jar;jars/units-0.01.jar;......
Conv %1 %2 %3

Trinnene i "Conv" repræsenterer, hvor langt processen er kommet. Når den sidste %3 er udført, kan man så sætte en reference op inde i bat-filen, hvormed en metode i en klasse i C# efterfølgende udføres?
Avatar billede arne_v Ekspert
06. november 2008 - 17:28 #25
Prøv og ret classpath fra relativ til absolut sti i BAT filen.
Avatar billede kkaen Nybegynder
09. november 2008 - 00:05 #26
Men igen: det er altså kun for at undgå at skrive den absolute sti til java-filen ?
Men som jeg skrev i 03/11-2008 22:09:56, så har det vel ingen indflydelse på resultattet, når jeg har fået det overordnede til at køre nu? Forskellen bliver vel, at man ikke behøver skrive den fuldstændige sti til filen mere. Men bat-filen skal vel stadig køres 1 gang, før classpath'en er inde i systemet? Og så kan man vel lige så godt benytte den sti efterfølgende i systemet? Eller er jeg ikke med?
Avatar billede arne_v Ekspert
09. november 2008 - 00:29 #27
Hvis man kører med -classpath så bruges den men den bliver ikke gemt.
Avatar billede kkaen Nybegynder
30. december 2010 - 16:07 #28
Arne_V ->
Lægger du lige et svar?
Avatar billede arne_v Ekspert
30. december 2010 - 17:50 #29
ok
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
Kategori
Kurser inden for grundlæggende programmering

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