Avatar billede kkaen Nybegynder
15. oktober 2010 - 11:30 Der er 11 kommentarer og
1 løsning

Køre program gennem applet og JNLP

Jeg har et java-program, som jeg gerne vil gøre tilgængelig på nettet. Jeg har fundet en del information omkring emnet, men jeg kan ikke få det til at "spille" sammen.

Java-programmet og tilhørende ressourcer skal pakkes ned i en jar-fil. Dette er gjort.
Så tilrådes det vist, at programmet ekserkveres gennem Jnlp, som refereres gennem en applet. Men da appletten står for det grafiske, skal den vel udskiftes med mit java-program?

Problemet er så, at jeg ikke kan få de forskellige ting til helt at virke (jeg udvikler i Netbeans).

Hvordan opbygger jeg helt nøjagtig de forskellige filer skridt for skridt, så jeg kan få det til at virke?

Her er koden:

Jnlp (af navn "newJnlpTemplate.jnlp"):
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="" href="newJnlpTemplate.jnlp">
    <information>
        <title>Program</title>
        <vendor>Mig</vendor>
    </information>
    <resources>
        <!-- Application Resources -->
        <j2se version="1.6+"/>
        <jar href="org-program-window.jar"/>
    </resources>
    <application-desc main-class="org.program.programWindowTopComponent">
        <!-- Application Arguments -->
    </application-desc>
</jnlp>

HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
        <h3>Test page for launching the applet via JNLP</h3>
        <script type="text/javascript" src="http://java.com/js/deployJava.js"></script>
        <script type="text/javascript">
            var attributes = {
                code:      "org.program.programWindowTopComponent",//here: java-class in archive (before: "NewJApplet")
                archive:    "org-program-window",
                width:      500,
                height:    500
            };
            var parameters = {jnlp_href:"newJnlpTemplate.jnlp"}; <!-- Applet Parameters -->
            var version = "1.5"; <!-- Required Java Version -->
            deployJava.runApplet(attributes, parameters, version);
        </script>
        <!-- Or use the following applet element to launch the applet using jnlp_href -->
        <!--
        <applet width="500" height="500">
            <param name="jnlp_href" value="JnlpExamplePaintit-2.jnlp"/>
        </applet>
        -->
    </body>
</html>
Avatar billede arne_v Ekspert
15. oktober 2010 - 19:23 #1
Hvilken fejl får du?
Avatar billede kkaen Nybegynder
15. oktober 2010 - 19:49 #2
Jeg har fået forskellige fejl alt efter hvilke små ting, jeg har rettet i forsøgt på at få det til at virke.

Jeg kan desværre ikke komme med en konkret fejl lige p.t., men jeg håbede på, at jeg kunne blive vejledt med en "skridt for skridt"-vejledning i oprettelse af applet, som benytter et java-program, hvor det hele så køres gennem Jnlp?
Avatar billede arne_v Ekspert
15. oktober 2010 - 19:56 #3
I can give a very simple example:

myhtml.html


<script src="http://www.java.com/js/deployJava.js"></script>
<script>
    var attributes = { code:'mypackage.MyApplet',  width:600, height:400} ;
    var parameters = {jnlp_href: 'myjnlp.jnlp'} ;
    deployJava.runApplet(attributes, parameters, '1.6');
</script>


myjnlp.jnlp


<?xml version="1.0" encoding="UTF-8"?>
<jnlp href="myjnlp.jnlp">
    <information>
        <title>Applet via JNLP demo</title>
        <vendor>Arne</vendor>
    </information>
    <resources>
        <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se" />
        <jar href="myjar.jar" main="true" />
    </resources>
    <applet-desc name="JNLP demo" main-class="mypackage.MyApplet" width="600" height="400">
    </applet-desc>
</jnlp>


MyApplet.java


package mypackage;

import java.awt.*;
import javax.swing.*;

public class MyApplet extends JApplet {
  public void init() {
      getContentPane().setLayout(new BorderLayout());
      getContentPane().add(new JLabel("This shit works"), BorderLayout.CENTER);
  }
}
Avatar billede kkaen Nybegynder
18. oktober 2010 - 09:55 #4
Tak for eksemplet - men jeg fik dog også et lignende eksempel til at virke ved at følge default-opsætning i Netbeans.

Problemet opstår i sidste led - i Appletten hvor det grafiske foregår.

I mit eksempel skal der ikke oprettes noget grafisk i appletten, men derimod skal der køres et java-program derinde i, som står for det grafiske. Er der mulighed for det? Skal java-programmet så blot initialiseres inde i init()? Og også når programmet er af typen "Netbeans Platform"?
Avatar billede kkaen Nybegynder
18. oktober 2010 - 10:29 #5
...måske var jeg lidt for hurtig i sidste indlæg. Jeg har nemlig forsøgt, at implementere dit eksempel. Og jeg kan ikke få det til at virke. Eneste forskel fra det eksempel, jeg fik til at virke pr default i Netbenas, var, at i dit eksempel har jeg lagt alle filer ind i en package, og i default-eksemplet var det i <default package>.

Exceptionen er:

com.sun.deploy.net.FailedDownloadException: Unable to load resource: file:/C:/Documents and Settings/user/Dokumenter/NetBeansProjects/JavaApplicationJnlp/src/projekt/$$codebase/org-projekt-window.jar
    at com.sun.deploy.net.DownloadEngine.actionDownload(Unknown Source)
    at com.sun.deploy.net.DownloadEngine.getCacheEntry(Unknown Source)
    at com.sun.deploy.net.DownloadEngine.getCacheEntry(Unknown Source)
    at com.sun.deploy.net.DownloadEngine.getResourceCacheEntry(Unknown Source)
    at com.sun.deploy.net.DownloadEngine.getResourceCacheEntry(Unknown Source)
    at com.sun.deploy.net.DownloadEngine.getResource(Unknown Source)
Avatar billede kkaen Nybegynder
18. oktober 2010 - 13:33 #6
For at være helt sikker på, at de rigtige filer er i war/jar-filen, har jeg forsøgt at kompilere filen inde i Netbeans igen. Det gav 3 fejl, som var referencer til moduler, som jeg ikke bruger i projektet, men som alligevel var som referencer. Dem slettede jeg ved slette linien "<fileset file="${jnlp.dest.dir}/master.jnlp"/>" fra "jnlp.xml" -> "<verifyjnlp>".

Herved bliver war'en genereret. War'en åbner jeg i winrar, og pakker ud. Så forsøger jeg at køre master.jnlp, men så kommer fejlen: "com.sun.deploy.net.FailedDownloadException: Unable to load resource: file:/C:/Documents and Settings/user/Dokumenter/NetBeansProjects/project/projectSuite/dist/projectsuite/$$codebase/branding.jnlp
".
Og dette kommer selvom branding.jnlp faktisk ligger i samme bibliotekm som master.jnlp.

Der bliver altså ved med at komme diverse "mærkelige" fejl. Så måske bliver man nødt til at oprette projektet i Swing i stedet for Netbeans Platform...selvom jeg da har set eksempler online, hvor Netbeans Platform godt kunne laves i jnlp.
Avatar billede kkaen Nybegynder
19. oktober 2010 - 10:45 #7
Ahh, det er nok fordi, man ikke bare sådan lige kan bruge en TopComponent sådan lige ud fra jar'en.
Derfor er jeg ved at forsøge at trække TopComponent ud fra jar'en, lægge den over i et panel (som vises i appletten) og så vise appletten.

Men jeg kan ikke helt få ressourcen ud fra jar'en.

Her er koden:

try
{
    InputStream in = projectApplet.class.getResourceAsStream("/org-project-window.jar");
    BufferedReader br =new BufferedReader(new InputStreamReader(in));
    String line;
   
    while( (line = br.readLine() ) !=null)
    {
        //dumps the contents of the data file to the System Console
        if(line.startsWith("Top"))
        {
            System.out.println(line);

        }
    }

    jPanel1.add(projectApplet.class.getResource("/org-project-window.jar").);
}
catch(IOException e)
{
    System.out.print(e + "This error has occurred \n");
}

Hvordan får jeg lavet en reference til TopComponent inde i jar'en, og så får det vist inde i panellet?
Avatar billede kkaen Nybegynder
19. oktober 2010 - 14:13 #8
Nu er jeg gået et par skridt tilbage i processen, og har lavet lidt videre derfra.

Jeg har forsøgt at oprette en jApplet inde i TopComponent-projektet, hvor jeg overfører TopComponent'ten til. Og inde i Netbeans vises dette grafisk korrekt.
Så genererer jeg en ny jar-fil, og opdaterer jnlp-filen i projektet, hvor html-filen er. Det giver en lang fejl, med slut-telsten:

network: Cache entry not found [url: file:/C:/Documents%20and%20Settings/user/Dokumenter/NetBeansProjects/JavaApplicationJnlp/src/project/$$codebase/org-project-window.jar, version: null]
network: Cache entry not found [url: file:/C:/Documents%20and%20Settings/user/Dokumenter/NetBeansProjects/JavaApplicationJnlp/src/project/$$codebase/org-project-window.jar, version: null]
basic:      String: \C:\Documents%20and%20Settings\user\Dokumenter\NetBeansProjects\JavaApplicationJnlp\src\project\$$codebase\org-project-window.jar
basic:  decoded to: \C:\Documents and Settings\user\Dokumenter\NetBeansProjects\JavaApplicationJnlp\src\project\$$codebase\org-project-window.jar
java.io.FileNotFoundException: C:\Documents and Settings\user\Dokumenter\NetBeansProjects\JavaApplicationJnlp\src\project\$$codebase\org-project-window.jar (Den angivne sti blev ikke fundet)

og nederst i Java Consolen står der:
"Exception: com.sun.deploy.net.FailedDownloadException: Unable to load resource: file:/C:/Documents%20and%20Settings/user/Dokumenter/NetBeansProjects/JavaApplicationJnlp/src/project/$$codebase/org-project-window.jar"

Jnpl-filen:
<?xml version='1.0' encoding='UTF-8'?>
<jnlp spec='1.0+' codebase='$$codebase' href="">
  <information>
  <title>module8</title>
  <vendor>NetBeans</vendor>
  <description kind='one-line'>module8</description>
  <description kind='short'>module8</description>
  </information>
<security><all-permissions/></security>
  <resources>
      <j2se version="1.6+"
              href="http://java.sun.com/products/autodl/j2se"
              max-heap-size="128m" />
      <jar href='org-project-window.jar' main="false" />
  </resources>
  <applet-desc
        name="project"
        main-class="org-project-window-projectJApplet"
        width="300"
        height="300">
    </applet-desc>
</jnlp>

Html-filen:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
      <script type="text/javascript" src="http://www.java.com/js/deployJava.js"></script>
      <script  type="text/javascript">
        var attributes = { code:'org.project.window.projectJApplet',  width:600, height:400} ;
        //lav applet med tomComponent i...
        var parameters = {jnlp_href: 'org-project-window.jnlp'} ;
        deployJava.runApplet(attributes, parameters, '1.6');
      </script>
  </body>
</html>

Er fejlen ikke en reference-fejl nu? Jeg mener: det ser da ud til, at det grundlæggende i projektet virker nu - men er det ikke "/$$codebase/org-project-window.jar" som giver fejlen? I så fald hvorfor? Er det "/$$codebase/"-delen, som forårsager en fejl?
Avatar billede kkaen Nybegynder
19. oktober 2010 - 14:25 #9
Referencen til filen er rigtig nok. Så kommer "/$$codebase/"-delen, og efterfølgende stien ned i jar-filen (som også er rigtig nok - hvis man tager "-" = "\") .... ?
Avatar billede kkaen Nybegynder
20. oktober 2010 - 14:13 #10
Okay, nu har jeg simpelthen taget tyren ved hornene, og droppet det Netbeans Platform dér. Så nu har jeg overført det hele til en god gammeldags swing-applikation.

Nu spiller det hele så næsten. Jeg kan køre den genererede jnlp-fil, hvorved programmet åbner rigtig nok.
Jeg kan også sætte:

<script>
  deployJava.createWebStartLaunchButton("launch.jnlp")
</script>

ind i html'en, hvorved programmet også åbnes, hvis linket klikkes.

Men jeg kan IKKE få det til at køre PÅ netsiden - altså inde i en applet.

I mit forsøg på at få appletten til at virke, har jeg konstrueret en applet inde i projektet, hvori jeg har tilføjet denne main:

public static void main(String[] args) {
  Component applet = new NewJApplet();

  StandaloneJFrame frame = new StandaloneJFrame();
  frame.getContentPane().add(applet);

  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.pack();
  frame.show();
}

Hvis jeg kører den inde i Netbeans, så kommer programmet frem - dog uden menu-linien, hvor man normalt bl.a. kan restarte appletten. Er dette ikke fordi, jeg reelt opretter en frame, hvor appletten oprettes inde i, og det ønskede jo egentlig var det omvendte? Jeg har forsøgt at lave det omvendte, men jeg blev nødt til at opgive det.

Hvorom alting er, så har jeg forsøgt, at gengive de vigtige informationer fra dit eksempel tidligere på den genererede html-side, så der istedet blev henvist til appletten i mit projekt fremfor JFramen i projektet.

Under kørslen står der en masse i java-consolen. Efter filtrering står der:

1:
basic: exception: JNLP not an applet.
exception: JNLP not an applet.
JNLPException[category: Launch File Error : Exception: java.lang.Exception: JNLP not an applet : LaunchDesc:

2:
at sun.plugin2.applet.JNLP2Manager.loadJarFiles(Unknown Source)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Exception: JNLPException[category: Launch File Error : Exception: java.lang.Exception: JNLP not an applet : LaunchDesc:
reference til Jnlp-filen

Kan du (eller andre) vejlede mig yderligere?
Avatar billede kkaen Nybegynder
20. oktober 2010 - 15:09 #11
Kan man evt. benytte svaret på denne side:

http://www.jguru.com/faq/view.jsp?EID=13602

?
Avatar billede kkaen Nybegynder
30. december 2010 - 15:53 #12
Lukkes....
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