我正在尝试在Java Web Start中部署一个非常简单的应用程序。我对此完全陌生。
我的应用程序包含一个Java文件。在通过java(java CustomDemo)运行应用程序时,它会显示一个包含按钮的对话框。当用户单击该按钮时,将读取属性文件,并且Hello World将作为标签显示在对话框中。
我想在Web Start中部署该应用程序。
我遵循的步骤。
现在的问题是,如果我将标签显示为任何硬编码的字符串,那么应用程序就像魅力一样。但是一旦我读取属性文件,我在Java Web Start中运行“异常发现文件”时会遇到异常
我的示例代码如下
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();
}
}
<?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>
<!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里面。即使我也尝试过这种方式。
答案 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中运行良好。但是当我从命令行运行时,为什么这会出错。