0

Java Web Start で非常に単純なアプリケーションをデプロイしようとしています。私はこれにまったく新しいです。

私のアプリケーションには、1 つの Java ファイルが含まれています。アプリケーションを Java (Java CustomDemo) で実行すると、ボタンを含むダイアログが表示されます。ユーザーがそのボタンをクリックすると、プロパティ ファイルが読み込まれ、Hello World がラベルとしてダイアログに表示されます。

  • NB : 1 つのフォルダー内に、Java クラスと .properties ファイルがあります。

そのアプリケーションを Web Start にデプロイしたいと考えています。

私が従った手順。

  1. アプリケーションの jar を作成しました (jar -cvf SampleDemo.jar CustomDialog.class)。
  2. jnlpファイルを書きました。
  3. index.html ページを作成しました
  4. 全体を tomcat/webapps に保持し、tomcat にデプロイします。

問題は、ラベルをハードコードされた文字列として表示すると、アプリケーションが魅力的に機能することです。しかし、プロパティファイルを読んでいるとすぐに、Java Web Start で実行中に「File Not Found Eception」という例外が発生します。

私のサンプルコードは次のとおりです

CustomDialog.java

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JTable;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Properties;

public class CustomDialog extends JDialog implements ActionListener
{
    protected boolean i_boolButtonClicked = false;
    protected String LABEL                = "";

    public CustomDialog()
    {
        this.setSize(500, 300);
        JButton but = new JButton("Hello");


        //Start Anjan to read data/text from .properties file..
        Properties  i_propConfig        = new Properties();
        try
        {
            FileInputStream inStream = new FileInputStream("./Test.properties");
            i_propConfig.load( inStream  );
            inStream.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        String l_strKey = "";
        String l_strVal = "";

        Enumeration l_enum = i_propConfig.keys();
        while(l_enum.hasMoreElements())
        {
            l_strKey = (String)l_enum.nextElement();

            if(l_strKey == null || l_strKey.equals( "" ))
                continue;

            l_strVal = i_propConfig.getProperty( l_strKey );

            if(l_strVal == null || l_strVal.equals( "" ))
                continue;
        }

        System.out.println("Properties read from file--> Key: "+l_strKey +" Value: " +l_strVal);
        LABEL = l_strVal;
        //End Anjan to read data/text from .properties file..

//      but.addActionListener(new ActionListener() 
//      {
//          public void actionPerformed(ActionEvent e) 
//          {
//              //getContentPane().add(new JLabel("Hello World"));
//              getContentPane().add(new JLabel(LABEL));
//              getContentPane().validate();
//          }
//      });

        but.addActionListener(this);

        Dimension dim=Toolkit.getDefaultToolkit().getScreenSize();          
        this.setLocation((int)(dim.width- getWidth ())/2,(int)(dim.height-this.getHeight ())/2);

        but.setSize(600, 5);
        this.add(but);
        this.setLayout(new FlowLayout(FlowLayout.LEFT));
        this.setVisible(true);
    }

    public static void main(String[] args) 
    {
        CustomDialog l_objCustomDialog = new CustomDialog();
    }

    protected void processWindowEvent(WindowEvent e) 
    {
        super.processWindowEvent(e);

        if (e.getID() == WindowEvent.WINDOW_CLOSING) 
        {
            setVisible(false);
            System.exit(0);
        }
    }

    public void actionPerformed(ActionEvent e) 
    {
        System.out.println("Hello button clicked......");
        getContentPane().add(new JLabel(LABEL));
        getContentPane().validate();
    }
}

SwingDemo.jnlp

<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="http://172.28.1.139:8400/SwingDemo" href="SwingDemo.jnlp">
    <information>
        <title>Swing Demo</title>
        <vendor>Swing</vendor>
    </information>
    <resources>
        <!-- Application Resources -->
        <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/>
        <jar href="SwingDemo.jar" main="true" download="eager" />
    </resources>

    <application-desc
         name="SwingDemo Demo Application"
         main-class="SwingDemo.CustomDialog"
         width="300"
         height="300">
     </application-desc>
     <update check="background"/>

<security>
    <all-permissions/>
</security>
</jnlp>

index.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> New Document </TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
 </HEAD>

 <BODY>
    <script src="http://www.java.com/js/deployJava.js"></script>
    <script>
        // using JavaScript to get location of JNLP file relative to HTML page
        var dir = location.href.substring(0,location.href.lastIndexOf('/')+1);
        var url = dir + "SwingDemo.jnlp";
        deployJava.createWebStartLaunchButton(url, '1.6.0');
    </script>
 </BODY>
</HTML>

数日間、私はちょうど掘り下げていて、解決策を見つけることができませんでした.Web Startで.propertiesファイルを読み取る他の方法があるに違いないと思います. 問題を解決できるように、明確でスマートな方法を誰かが提案できますか?

もう1つ、jar内にプロパティファイルを固定したくありません。私もそのようにしてみました。

4

2 に答える 2

2

FileNotFoundExceptionJWS アプリでを修正する方法。URLでリソースにアクセスすることです。

この URL はgetClass.getResource(String)、プロパティ ファイルが JWS アプリのランタイム クラスパスにある場合に使用して形成できます。jar( JNLP の要素で参照される Jar 内)。

リソースがサーバー上で緩んでいる場合、URL はコード ベースまたはドキュメント ベース (アプレットの場合) に対して相対的に形成される可能性があります。

URL は、「読み取り/書き込み」ではなく、事実上「読み取り専用」を意味することに注意してください。プロパティが変更された場合、それらをローカルでシリアル化するためのより複雑な戦略を追求する必要があります。

于 2012-12-27T17:48:14.610 に答える
0

@Andrew Thompsonあなたが言ったように、私はリソースをロードする方法に従いました。コードのスニペットはここにあります:

String url = "Test.properties";

System.out.println("Before printing paths..");
System.out.println("Path2: "+ getClass().getResource(url).getPath());

FileInputStream inputStream = new FileInputStream(new File(getClass().getResource(url).toURI()));
i_propConfig.load(inputStream);
inputStream.close();

階層を使用してEclipseで構成しました(ソースの下にSwingDemoというフォルダーがあります。SwingDemoにはJavaファイルとリソースファイルがあります)...

* src

  *SwingDemo

      *CustomDialog.java

      *Test.properties

私がこれをEclipseで実行しているときは、すべてが正常に実行されています。しかし、cmd行からアプリを実行しようとするとすぐにnullポインター例外が発生します。

コマンドライン展開の階層は次のとおりです。

フォルダ:D:\ Work \ Java Progrms \ SwingDemo

階層:* SwingDemo

              *CustomDialog.java            

              *Test.properties

まず、このファイルをcmd行(javac CustomDialog.java)からSwingDemoフォルダー内にコンパイルしました。次に、Java Progrmsフォルダーに1ステップ戻り(.javaクラス内のパッケージについて説明しました)、有名な「javaSwingDemo.CustomDialog」を使用してアプリを実行します。以前にnewFileInputStream( "path")を使用したときは、同様の手順を実行していました。この方法を実行した後、nullポインタ例外が発生します。

「getClass()。getResource(url)」は特定のディレクトリからファイルを読み込めないと思います。そのため、リソースをJavaファイルと同じディレクトリに配置しました。Eclipseでは正常に動作しました。しかし、コマンドラインから実行したときにこれがエラーになるのはなぜですか。

于 2012-12-30T07:42:35.917 に答える