java web start部署属性文件读取

时间:2012-12-27 17:25:23

标签: java file properties java-web-start

我正在尝试在Java Web Start中部署一个非常简单的应用程序。我对此完全陌生。

我的应用程序包含一个Java文件。在通过java(java CustomDemo)运行应用程序时,它会显示一个包含按钮的对话框。当用户单击该按钮时,将读取属性文件,并且Hello World将作为标签显示在对话框中。

  • N.B:在一个文件夹中,我有java类和.properties 文件。

我想在Web Start中部署该应用程序。

我遵循的步骤。

  1. 我已经制作了一个我的应用程序罐(jar -cvf SampleDemo.jar CustomDialog.class)。
  2. 我写了jnlp文件。
  3. 我创建了一个index.html页面
  4. 将所有内容保存在tomcat / webapps中并在tomcat中部署。
  5. 现在的问题是,如果我将标签显示为任何硬编码的字符串,那么应用程序就像魅力一样。但是一旦我读取属性文件,我在Java Web Start中运行“异常发现文件”时会遇到异常

    我的示例代码如下

    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>
    

    有几天我只是在挖掘,找不到任何解决办法。我认为在网站启动时必须有其他方式来阅读.properties文件。任何人都可以提出任何明确而聪明的方法来解决问题。

    还有一件事我不想把属性文件固定在我的jar里面。即使我也尝试过这种方式。

2 个答案:

答案 0 :(得分:2)

在JWS应用中修复FileNotFoundException的方法。是通过URL访问资源。

如果属性文件位于JWS应用程序的运行时类路径上,则可以使用getClass.getResource(String)形成该URL。 (在JNLP中jar元素中引用的Jar中。)

如果资源在服务器上松散,则可以相对于代码库或文档库(如果它是applet)形成URL。

请注意,URL有效“只读”而不是“读/写”。在属性发生变化的情况下,我们需要采用更复杂的策略来在本地对其进行序列化。

答案 1 :(得分: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行运行应用程序,就会出现空指针异常..

命令行部署层次结构如下:

文件夹:D:\ Work \ Java Progrms \ SwingDemo

层次结构:* SwingDemo

              *CustomDialog.java            

              *Test.properties

首先,我在cmd行(javac CustomDialog.java)的SwingDemo文件夹中编译了这个文件。然后我向Java Progrms文件夹移动一步(正如我在.java类中提到的那样)并使用着名的“java SwingDemo.CustomDialog”运行应用程序。我之前使用新的FileInputStream(“path”)时,我曾经遵循类似的步骤。       在做这种方式之后我得到空指针异常..

我认为“getClass()。getResource(url)”无法从特定目录加载文件。这就是为什么我把资源放在与我的java文件相同的方向上。它在Eclipse中运行良好。但是当我从命令行运行时,为什么这会出错。