我已经苦恼了好几天,试图找出为什么这似乎从来没有起作用!首先,这是我的配置:
Windows 7 x64 JDK 7 x86 JRE 7 x86 Firefox x86 Rails 3由Thin提供服务 Java设置是"下一代插件"未激活(但它总是以某种方式重新激活自己!!!)
起初我尝试使用RXTX,但我一直收到“未找到类”错误。现在我转向winjcom。我现在得到的错误是:java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "loadLibrary.winjcom")。
我还注意到我的服务器日志因我使用的浏览器而异。如果我使用Firefox,当浏览器尝试加载小程序时,不会显示任何GET日志(即,当小程序加载失败时,没有进一步下载)。如果我在IE9中尝试,则所有日志都在那里,除了“PortWriter.class” GET日志……这意味着由于某种原因未检索到它。
当我避免使用JNLP时,我会得到安全警告弹出窗口,并且没有错误……当然,在运行“发送”方法时会出现安全访问错误。但是,当我使用JNLP时,IE可以正常加载它并仍然给出错误……但是当我关闭它时会崩溃(我必须结束iexplorer进程)。 Firefox只是不加载页面……它在进度条处停止。
更新-我已经将事情推到了一个点,如果我通过java的安全策略文件绕过安全性,则小程序将起作用。但是,JNLP不起作用-我认为这就是通常在通过小程序标记运行时出现安全错误的原因。当我直接访问JNLP文件时,我会收到一个错误,指出无法找到“PortWriter”类。我的jar有问题吗?我注意到其他jar的文件夹布局与其包布局完全匹配(例如,“com\myname\serialport\PortWriter.jar”,如果包是com.myname.serialport.PortWriter)。但是,我的jar布局复制了我的物理文件夹布局(例如,“D:\Files\Websites\pos\assets\java\PortWriter.jar”)。这是导致错误的原因吗?我已经手动更改了jar内容(包括清单文件)以匹配根目录,但可能做错了什么。我还更新了此问题中的JNLP布局,以说明我最新的更改,这些更改已由JaNeLa验证。
这是我的.java文件:
我该如何让这些东西工作?我是Java新手,但我只想得到一个可行的解决方案。这是为了我们公司的POS,我正在用Rails制作。
最终文件为:
在服务器上的 /assets/java/ 目录下: 1) jcomport.jar(未签名...) 2) PortWriter.class(以及所有相关的类文件) 3) PortWriter.jar 4) PortWriter.jnlp 在本地硬盘的 %java home%/ 目录下: 1) /lib/ext/jcomport.jar(未签名) 2) /bin/winjcom.dll
Windows 7 x64 JDK 7 x86 JRE 7 x86 Firefox x86 Rails 3由Thin提供服务 Java设置是"下一代插件"未激活(但它总是以某种方式重新激活自己!!!)
起初我尝试使用RXTX,但我一直收到“未找到类”错误。现在我转向winjcom。我现在得到的错误是:java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "loadLibrary.winjcom")。
我还注意到我的服务器日志因我使用的浏览器而异。如果我使用Firefox,当浏览器尝试加载小程序时,不会显示任何GET日志(即,当小程序加载失败时,没有进一步下载)。如果我在IE9中尝试,则所有日志都在那里,除了“PortWriter.class” GET日志……这意味着由于某种原因未检索到它。
当我避免使用JNLP时,我会得到安全警告弹出窗口,并且没有错误……当然,在运行“发送”方法时会出现安全访问错误。但是,当我使用JNLP时,IE可以正常加载它并仍然给出错误……但是当我关闭它时会崩溃(我必须结束iexplorer进程)。 Firefox只是不加载页面……它在进度条处停止。
更新-我已经将事情推到了一个点,如果我通过java的安全策略文件绕过安全性,则小程序将起作用。但是,JNLP不起作用-我认为这就是通常在通过小程序标记运行时出现安全错误的原因。当我直接访问JNLP文件时,我会收到一个错误,指出无法找到“PortWriter”类。我的jar有问题吗?我注意到其他jar的文件夹布局与其包布局完全匹配(例如,“com\myname\serialport\PortWriter.jar”,如果包是com.myname.serialport.PortWriter)。但是,我的jar布局复制了我的物理文件夹布局(例如,“D:\Files\Websites\pos\assets\java\PortWriter.jar”)。这是导致错误的原因吗?我已经手动更改了jar内容(包括清单文件)以匹配根目录,但可能做错了什么。我还更新了此问题中的JNLP布局,以说明我最新的更改,这些更改已由JaNeLa验证。
这是我的.java文件:
import com.engidea.comm.CommPort;
import com.engidea.comm.CommPortIdentifier;
import com.engidea.comm.SerialPort;
import com.engidea.comm.SerialPortEvent;
import com.engidea.comm.SerialPortEventListener;
import com.engidea.win32jcom.WinjcomIdentifier;
import java.io.*;
import java.util.Iterator;
import java.util.List;
import java.applet.*;
import java.security.*;
/*
WinJcom is a native interface to serial ports in java.
Copyright 2007 by Damiano Bolla, Jcomm@engidea.com
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This can be used with commercial products and you are not obliged
to share your work with anybody.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/**
* Simple class that can list system ports and allow IO
*/
public class PortWriter extends Applet
{
private CommPortIdentifier portIdentifier;
private SerialPort serport;
public void init () {System.out.println("Booting...");}
@SuppressWarnings("unchecked")
public void Sends(String port, String message) throws Exception
{
final String com_port = port;
final String send_message = message;
AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
System.out.println("Begin...");
portIdentifier = new WinjcomIdentifier(0);
System.out.println("Selecting Port...");
selectComport(com_port);
new Thread(new PortReader()).start();
System.out.println("Sending...");
typeSendBytes(send_message);
return true;}
});
}
private void typeSendBytes( String message )
{
try
{
System.out.println("Trying To Send...");
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String aStr = "";
while (aStr != null)
{
aStr = message + "\r\n";
// WARNING: be careful, you shoulod select the encoding !
// This will timeout if you have FLOW CONTROL and theline is stuck !
byte []buf = aStr.getBytes();
serport.write(buf,0,buf.length );
}
}
catch ( Exception exc )
{
exc.printStackTrace();
}
}
private SerialPort openPort ( String portName )
{
try
{
CommPort aPort = portIdentifier.getCommPort(portName);
aPort.open();
return (SerialPort)aPort;
}
catch ( Exception exc )
{
System.out.println("exc="+exc);
exc.printStackTrace();
}
return null;
}
private void selectComport ( String portName )
{
try
{
serport = openPort(portName);
serport.setSerialPortParams(9600,8, SerialPort.STOPBITS_2, SerialPort.PARITY_NONE);
serport.enableReceiveTimeout(20000);
serport.setEventListener(new EventListener());
serport.notifyOnDSR(true);
serport.notifyOnCarrierDetect(true);
serport.notifyOnCTS(true);
}
catch (IOException exc)
{
System.out.println("Exc="+exc);
exc.printStackTrace();
}
}
private final class EventListener implements SerialPortEventListener
{
public void serialEvent(SerialPortEvent ev)
{
System.out.println("Got event="+ev);
}
}
private final class PortReader implements Runnable
{
public void run()
{
try
{
// This will timeout if nothing is received in the specified time.
byte []buff = new byte[1];
while ( serport.read(buff,0,buff.length) > 0 )
{
// NOTE: you should be checking the encoding !
System.out.print(new String(buff));
}
}
catch ( Exception exc )
{
exc.printStackTrace();
}
}
}
}
...以及我的JNLP文件:
<?xml version="1.0" encoding="utf-8"?>
<jnlp codebase="http://localhost/assets/" href="PortWriter.jnlp">
<information>
<title>RS232 Communication Applet</title>
<vendor>My Company</vendor>
<description>RS232 Applet for communicating with POS Display Pole</description>
<offline-allowed />
</information>
<security>
<all-permissions/>
</security>
<update check="background" />
<resources>
<jar href="PortWriter.jar" part="com" main="true" />
<jar href="winjcom.jar" part="com" />
<nativelib href="jcomport.jar" part="com" />
</resources>
<applet-desc
name="RS232 Communication Applet"
main-class="PortWriter"
width="1" height="1" />
</jnlp>
...以及我的HTML代码:
<applet id="SerialPort" width="1" height="1" codebase="/assets/" code="PortWriter.class" archive="PortWriter.jar">
<param name="jnlp_href" value="PortWriter.jnlp" />
</applet>
我该如何让这些东西工作?我是Java新手,但我只想得到一个可行的解决方案。这是为了我们公司的POS,我正在用Rails制作。
最终文件为:
在服务器上的 /assets/java/ 目录下: 1) jcomport.jar(未签名...) 2) PortWriter.class(以及所有相关的类文件) 3) PortWriter.jar 4) PortWriter.jnlp 在本地硬盘的 %java home%/ 目录下: 1) /lib/ext/jcomport.jar(未签名) 2) /bin/winjcom.dll