Java堂  


使用Jacob时出现的另一个UnsatisfiedLinkError错误:jacob.dll already loaded in another classloader

Filed under: JavaPlateform — Jet @ 12:00 上午
Tags:
原文出处: http://www.javatang.com/archives/2009/06/01/0036305.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

之前文章中已经说过Jacob在windows2003环境下使用的时候会出现UnsatisfiedLinkError错误,解决的方法是需要下载Redistributable Package安装即可。

但如果在JavaEE项目中使用Jacob的时候还会出现另外一个UnsatisfiedLinkError错误:jacob.dll already loaded in another classloader,错误往往会出现在Web容器重启之后。后来查到下面的相关资料:

Java API表明:JVM只允许一个默认的ClassLoader来load native library,同时并不提供专门的API来unload一个loaded native library,因此无法在我们的重启Web应用的代码中来手工清除已经load的jacob。

原因找到了,这是因为在重启Web容器的时候并不会自动结束上一次对dll的加载,解决问题的关键在于重启Web程序之后要确保不要再次加载jacob.jar包,有一个方法就是不要将jacob.jar包放在web程序中,而是将jacob.jar包放在Web容积自身的lib目录下面就可以了。

参考资料:
jacob.dll already loaded in another classloader

卸载冰盾防火墙造成网卡不能使用的问题

Filed under: OS — Jet @ 8:32 上午
Tags: ,
原文出处: http://www.javatang.com/archives/2009/05/18/3237301.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

前段时间服务器上按照冰盾防火墙,在软件到期之后卸载了,等到重启服务器之后发现系统中网卡“消失”了。驱动没有了,重新安装网卡驱动没有效果,卸载掉网卡驱动再安装也没用,甚至在BOIS中将网卡屏蔽掉然后再启动依然不行。就这样来回折腾了三四个小时都是不能找到网卡,最后只能决定重新安装一下系统。

因为在机房中进行操作,所以如果安装系统的话很多软件需要重新配置,非常麻烦。后来想到在卸载冰盾防火墙出现提示重启的时候我选择的否,然后我为了减少重启的次数又对“本地连接”中的TCP/IP属性进行了一些修改,最后才重启的,会不会是因为这个原因造成的?

于是我又重新安装了一遍冰盾防火墙,重启之后久违的“本地连接”出现了,网络连接也正常了。这个时候再卸载冰盾防火墙,完成后直接重启服务器就没有之前的问题了。后来我又在本地一台服务器上面做了一个实验,就是再执行完冰盾卸载程序之后不立即重启,然后对“本地连接”中的TCP/IP属性进行操作之后再重启,依然发现“本地连接”消失了,看来这是冰盾防火墙卸载程序的一个重大bug。

解决的方法就是重新安装冰盾防火墙,然后执行完卸载重新之后立即重启就可以了。

一个VPN拨号之后不能上网的问题

Filed under: OS,Web&Server — Jet @ 1:41 上午
Tags:
原文出处: http://www.javatang.com/archives/2009/03/18/4138299.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

最近在服务器端使用路由器做了一个VPN服务,然后将远程登录等操作放在VPN中进行,增加了安全性。但是在公司里面使用VPN拨号上去之后发现不能浏览任何网站,于是对出现的问题进行了小结:
1) 拨号上去不能浏览网页,但是MSN和QQ可以使用;
2) 在家里使用ADSL环境下没有任何问题,但是在单位的局域网环境下有这个问题。

通过上面的现象可以分析出应该是因为DNS服务器的问题造成的,将网卡上面的DNS服务器强制设置成当地的DNS服务器还是不行。后来使用route print命令查看了一下路由表,发现是因为VPN拨号上去之后本地的默认网关已经放到VPN服务器上面了,必须还转移到本地才可以。于是使用route delete删除远程网关,然后使用route add将网关指向本地,这样就可以了。

但是后来想到总不能在公司里的每台机器都要这样设置吧?而且为什么ADSL环境下没有这个问题呢?在想这个问题的时候我无意间看到了本地局域网的IP地址为10.44.xxx.xxx,而VPN拨号上去分配的地址为10.240.xxx.xxx,于是想到会不会是因为二者都使用的是A类地址的原因呢?后来在VPN服务器上面将分配的地址修改为B类,再重新拨号连接,问题消失了。

附局域网可用的IP地址范围:

A类地址10.0.0.0 – 10.255.255.255
B类网172.16.0.0 – 172.31.255.255
C类网192.168.0.0 -192.168.255.255

参考资料:
教你解决公司VPN不能上网的故障(图)
局域网IP

在VC++ 2005中编写SAPI程序

Filed under: C++Plateform — Jet @ 7:42 上午
Tags: ,
原文出处: http://www.javatang.com/archives/2009/02/10/4240284.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

相对于经典的VC6而言,2005提供了很多实用的功能,比如语法着色、自动提示等等,所以逐渐将很多的项目转移到2005中进行开发了。最近在做一个SAPI开发的小程序,虽然在VC6中顺利编译成功了,但是在转移到2005的过程中遇到了一些问题,现在逐一记录下来。

1. 设置SAPI库文件
首先需要安装Microsoft Speech SDK5.1(微软官方下载页面现在失效了,可以直接下载或者到华军网站上下载),然后需要引用SAPI的头文件和类库,否则编译的时候提示找不到头文件或库文件。在VS2005分别打开“工具”-“选项”菜单,在左边分别选择“项目和解决方案”-“VC++ 目录”,然后在右边的“显示以下内容的目录”下拉框中选择“包含文件”,将“C:\Program Files\Microsoft Speech SDK 5.1\Include”目录(无引号)加入其中;再选中“库文件”,将“C:\Program Files\Microsoft Speech SDK 5.1\Lib\i386”加入其中。
VC2005选项

2. 发布程序
在VS2005的工具栏中调试选项有两种,一种是debug,一种是release。VC2005调试选项 通常来说,我们发布程序的时候会选择release选项。另外,对于一些旧的系统需要安装vs2005的运行环境,也就是所谓的Redistributable Package,注意有的时候安装完成之后需要重启一下电脑。

这点我就犯了一个错误,我将debug编译后的程序放到一个新的环境中总是提示初始化错误,即使安装完运行环境之后还是如此,后来将release之后的程序替换一下就可以了。

参考资料:
Using Events with TTS

Jacob出现UnsatisfiedLinkError错误的解决方法

Filed under: JavaPlateform — Jet @ 5:13 上午
Tags:
原文出处: http://www.javatang.com/archives/2009/02/09/1349278.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

Jacob是一个非常常用的用于在Java中连接COM组件的包,它底层使用JNI进行实现,简化了直接使用JNI调用COM组件的繁琐过程。

但是最新的Jacob在Windows 2003系统下使用的时候总是出现UnsatisfiedLinkError的提示,而在XP系统下使用正常。后来在Jacob官方论坛上面查到了解决方法,原来Jacob从1.13之后使用的开发工具是VC++ 2005,如果在旧的系统下运行程序出现UnsatisfiedLinkError错误的时候是因为系统中没有安装Redistributable Package,只要到微软的官方网站上下载这个文件安装之后就可以正常使用了。

参考资料:
can’t run jacob in win server 2003

IE6中出现“无法设置selected属性”的bug及解决方法

Filed under: Web&Server — Jet @ 6:07 下午
原文出处: http://www.javatang.com/archives/2008/10/19/0704277.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

如果在IE6中设置select控件的selected属性的时候,会提示“无法设置selected属性。未指明的错误。”比如执行如下代码:

  1. var selectObj = document.getElementById('selectId');
  2. // 执行下面语句之后出错
  3. selectObj.options[1].selected = true;

后来查了一下资料,发现这个错误在IE5.5、7及Firefox等浏览器下面没有问题,唯独IE6下有如下的提示。后来有人找到了一个解决的方法,就是设置selected属性的时候使用setTimeout函数设定一个时间即可,代码如下:

  1. var selectObj = document.getElementById('selectId');
  2. // 使用setTimeout之后问题解决
  3. setTimeout(function() {
  4.     selectObj.options[1].selected = true;
  5. }, 1);

参考资料:
急!请教高手:利用xml的selected问题!

Apache+Resin下如何写伪静态和301跳转

Filed under: SearchEngine,Web&Server — Jet @ 7:19 下午
Tags: , ,
原文出处: http://www.javatang.com/archives/2008/10/18/1942276.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

目前网上大多数资料都是介绍如何在Apache中设置伪静态的,在Resin中很少提及,经过实践实现了这一点,现在做如下总结。

1. Apache下如何写伪静态和301重定向
直接上代码(以本站域名为例):

  1. <IfModule mod_rewrite.c>
  2.     RewriteEngine On
  3.     # 叹号表示非,L表示最终结果,不再循环;NC是不区分大小写。
  4.     RewriteCond %{http_host} !^www.javatang.com [NC]
  5.     RewriteRule ^/(.*)$ http://www.javatang.com/$1 [R=301,NC,L]
  6.     RewriteRule ^(.*)/index(.*)$ $1/index.html [R=301,NC]
  7.   </IfModule>

2. Resin下如何写伪静态和301重定向
Resin下的重定向也是由伪静态来写的,不过具体一些的话他同页面伪静态是分别由两个tag来完成的,页面伪静态由forward完成,301永久重定向由moved-permanently完成。

下面是具体的代码:

  1. <rewrite-dispatch>
  2.         <forward regexp="^(.*)/archives/([^/]+)/([^/]+).html$" target="$1/archives.jsp?q=$3&amp;a=$2" />
  3.         <!-- HTTP 301 moved -->
  4.         <moved-permanently regexp="^(.*)/index(.*)$" target="$1/index.html"/>
  5.     </rewrite-dispatch>

这里需要特别注意的一点就是地址中的QueryString中&连接符需要使用&来代替,否则为出现错误。

因为JavaEE默认的web.xml文件不支持上述属性,所以可以在你的站点WEB-INF目录下创建一个resin-web.xml文件,这个文件会被Resin看作为站点配置文件,然后在文件中写下如下内容:

  1. <web-app xmlns="http://caucho.com/ns/resin"
  2.          xmlns:resin="http://caucho.com/ns/resin/core">
  3.     <rewrite-dispatch>
  4.         <forward regexp="^(.*)/archives/([^/]+)/([^/]+).html$" target="$1/archives.jsp?q=$3&amp;a=$2" />
  5.         <!-- HTTP 301 moved -->
  6.         <moved-permanently regexp="^(.*)/index(.*)$" target="$1/index.html"/>
  7.     </rewrite-dispatch>
  8. </web-app>

3. Apache+Resin组合的时候设置伪静态需要注意的地方

二者组合中Resin主要完成Servlet所映射的地址为文件类型,而Apache完成其余部分,因此关于页面伪静态部分需要在Resin和Apache中同时设置才有效,否则有时候会出现404错误。但对于301永久重定向来说,如果是涉及域名部分的只需要在Apache中设置即可,如果二者都设置的时候会出现域名解析错误;如果涉及到页面部分的话需要在二者中都设置。

关于Resin如何同Apache组合请看这篇文章 Resin 3.0.x 经验总结

关于Resin+Apache下如何设置泛域名请看这篇文章 Apache+Resin泛域名的设置

参考资料:
Resin url rewrite tags
Apache网站301永久重定向设置

修改Spark的默认字体大小

Filed under: JavaPlateform — Jet @ 5:56 上午
Tags:
原文出处: http://www.javatang.com/archives/2008/07/13/5634273.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

Spark是目前使用最多的Jabber客户端,最新的版本中已经提供了简体中文语言包,但是因为默认情况下Spark中使用的字号为11,所以中文汉字显示的非常难看。
spark默认界面

如果显示正常的话就需要将字号低于12的修改为12。首先在Spark源代码中查找 new Font 关键词,将所有设置为12以下的修改为12;然后打开 org.jivesoftware.Spark ,将其中的

  1. SyntheticaLookAndFeel.setFont("Dialog", 11);

修改为

  1. SyntheticaLookAndFeel.setFont("Dialog", 12);

重新编译之后就显示正常了。
显示正常的Spark

使用DWR出现“例外被抛出且未被接住”错误的原因和解决办法

Filed under: DynamicLanguage,JavaPlateform,RIA — Jet @ 8:19 上午
Tags:
原文出处: http://www.javatang.com/archives/2008/07/10/1954272.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

DWR提供了两个js文件:engine.js和util.js,通常来说我们都是动态来引用这两个js文件,在官方的例子中也是这样做的(其中dwr是mapping时的路径):

  1. <script type="text/javascript" src="/dwr/engine.js"></script>
  2. <script type="text/javascript" src="/dwr/util.js"></script>

但是根据页面优化原则,我们如果将所有的js文件进行压缩整合在一起的话将会极大的减少页面加载的时间。但是当我们将上面的两个js文件下载下来然后跟其他js文件整合压缩之后,访问页面的时候会出现一个“例外被抛出且未被接住”的脚本错误。

用百度搜索了一下基本只搜到一篇名为《dwr应用时请注意(初学者)》的文章,文章中建议使用他在附件中所提供的dwr.jar包。但是作者所提供的dwr版本有些低,另外作者并没有在文章中说明造成问题的原因。

后来将异常转换为英文 Exception thrown and not caught 在google中搜索了一下,得知是因为没有在页面中动态引用engine.js,因为dwr在运行的时候需要动态控制这个文件。

但是这样的话就达不到压缩engine.js文件的目的了,我无意中在官方看到一篇专门讲解怎样缓存engine.js文件的文章,下面我就将作者建议的做法说明如下:

首先使用动态加载engine.js文件,然后将该文件下载下来。打开下载下来的engine.js文件,然后将第226到242行之间的文字剪切下来,然后将dwr.jar包中的org/directwebremoting/engine.js文件内容删除,然后粘贴到该文件中并替换dwr.jar包中原来的engine.js文件,内容大致如下:

  1. dwr.engine._origScriptSessionId = "${scriptSessionId}";
  2. dwr.engine._sessionCookieName = "${sessionCookieName}";
  3. dwr.engine._allowGetForSafariButMakeForgeryEasier = "${allowGetForSafariButMakeForgeryEasier}";
  4. dwr.engine._scriptTagProtection = "${scriptTagProtection}";
  5. dwr.engine._defaultPath = "${defaultPath}";
  6. dwr.engine._pollWithXhr = "${pollWithXhr}";

这样就可以将下载下来的engin.js文件同其他文件进行压缩合并了,但是在页面中还必须动态引用engine.js:

  1. <script type="text/javascript" src="/dwr/engine.js"></script>

这样一来即压缩了engine.js文件中静态的部分,又使用了engine.js中的动态部分,并且最重要的是“例外被抛出且未被接住”异常也不会再出现了。

参考资料:
Caching engine.js

如何使用DWR2.0的注解功能

Filed under: DynamicLanguage,JavaPlateform,RIA — Jet @ 8:56 上午
Tags: ,
原文出处: http://www.javatang.com/archives/2008/07/07/5648271.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

DWR2.0新增加了JDK5的注解(Annotation)功能,使用注解功能之后可以从很大程度上简化了原来的dwr.xml的配置,使用起来非常的方便。

一、配置DWR使用注解功能

如果让dwr使用注解功能需要在web.xml进行如下配置:

  1. <servlet>
  2.         <servlet-name>dwr-invoker</servlet-name>
  3.         <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
  4.         <init-param>
  5.             <param-name>debug</param-name>
  6.             <param-value>true</param-value>
  7.         </init-param>
  8.         <!-- 将设定注解的域对象和业务实现类放在下面列表中,中间使用逗号间隔 -->
  9.         <init-param>
  10.             <param-name>classes</param-name>
  11.             <param-value>
  12.                 com.javatang.domain.Book,
  13.                 com.javatang.bank.Bank,
  14.                 com.javatang.dao.BookDao
  15.             </param-value>
  16.         </init-param>
  17.     </servlet>
  18.     <servlet-mapping>
  19.         <servlet-name>dwr-invoker</servlet-name>
  20.         <url-pattern>/scripts/ajax/*</url-pattern>
  21.     </servlet-mapping>

这样设置之后就可以在dwr中使用注解了,非常的方便。

二、DWR提供的注解类型
经常用到的注解主要有:@RemoteProxy、@RemoteMethod、@DataTransferObject和@RemoteProperty。

1. @RemoteProxy和@RemoteMethod
@RemoteMethod对应于原来dwr.xml文件中的create标签,用于创建DWR所提供的远程方法;而@RemoteMethod对应于create标签中的 <include method=”"/>,用来指定所要暴露的方法名称。我们举例来说明:

  1. @RemoteProxy(name="bankFunctions")
  2. public class  Bank {
  3.  
  4.     @RemoteMethod
  5.     public void buy() {
  6.         // ...
  7.     }
  8. }

从上面可以看出,@RemoteProxy表示这个类将用于远程方法,而使用@RemoteMethod指定所要暴露的方法,没有使用@RemoteMethod的方法将不会显示在客户端。
上面的注释使用dwr.xml表示如下:

  1. <!DOCTYPE dwr PUBLIC
  2.     "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
  3.     "http://getahead.ltd.uk/dwr/dwr20.dtd">
  4. <dwr>
  5.     <allow>
  6.         <create creator="new" javascript="bankFunctions">
  7.             <include method="buy" />
  8.         </create>
  9.     </allow>
  10. </dwr>

如果使用Spring中的DAO活逻辑层则需要进行如下的设置:

  1. // BookDao
  2. @RemoteProxy(creator = SpringCreator.class,
  3.     creatorParams = @Param(name = "beanName", value = "bookDao"),
  4.     name="bookFunctions")
  5. public class  BookDao {
  6.  
  7.     @RemoteMethod
  8.     public void addBook(Book book) {
  9.         // ...
  10.     }
  11. }

通过指定@RemoteProxy中的creator类型为SpringCreator,然后在creatorParams指定对应的beanName名称。对应的dwr.xml文件如下:

  1. <!DOCTYPE dwr PUBLIC
  2.     "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
  3.     "http://getahead.ltd.uk/dwr/dwr20.dtd">
  4. <dwr>
  5.     <allow>
  6.         <create creator="spring" javascript="bookFunctions">
  7.             <param name="beanName" value="bookDao" />
  8.             <include method="addBook" />
  9.         </create>
  10.     </allow>
  11. </dwr>

2. @DataTransferObject和@RemoteProperty
@DataTransferObject对应于原来dwr.xml文件中的convert标签,用于转换Java对象;@RemoteProperty则对应于convert标签中的 <param name=”include” value=”" />。

举例说明一下:

  1. @DataTransferObject
  2. public class Book {
  3.     @RemoteProperty
  4.     private int id;
  5.  
  6.     @RemoteProperty
  7.     private String name;
  8.  
  9.     public Book() {
  10.     }
  11.  
  12.     public int getId() {
  13.         return id;
  14.     }
  15.  
  16.     public void setId(int id) {
  17.         this.id = id;
  18.     }
  19.  
  20.     public String getName() {
  21.         return name;
  22.     }
  23.  
  24.     public void setName(String name) {
  25.         this.name = name;
  26.     }
  27. }

@RemoteProperty可以放在JavaBean中的私有变量上面,也可以放在getXXX方法上面。另外如果想将JavaBean中所有的属性都暴露出来的话,不需要在任何属性上面添加@RemoteProperty注释就可以了。

上面的注释对应的dwr.xml文件如下:

  1. <!DOCTYPE dwr PUBLIC
  2.     "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
  3.     "http://getahead.ltd.uk/dwr/dwr20.dtd">
  4. <dwr>
  5.     <allow>
  6.         <convert converter="bean"
  7.             match="com.javatang.domain.Book">
  8.             <param name="include" value="id, name" />
  9.         </convert>
  10.         <!-- 或者用下面的方式也可以
  11.         <convert converter="bean" match="com.javatang.domain.Book" />
  12.         -->
  13.     </allow>
  14. </dwr>

关于具体每个注释使用的方法已经所包含的参数可以参考Java Doc。使用DWR2.0的注解极大的简化了原来dwr.xml的配置,非常的方便。

参考资料:
DWR Annotations
[原创]DWR Annotations and Spring
DWR Annotations 使用 SpringCreator

« 上一页下一页 »