obr安装资源的时抛出异常:java.lang.IllegalStateException: Framework state has changed, must resolve again.

Apache Felix OSGi Bundle Repository
Apache Felix OSGi Bundle Repository

在使用obrApache Felix OSGi Bundle Repository)的实现类org.apache.felix.bundlerepository.Resolver分析和安装资源的时可能会抛出这个异常:java.lang.IllegalStateException: Framework state has changed, must resolve again.

见代码:

在deploy之前先调用resolve方法,确保这个resolver所需的requirement都能满足,如果有任意的requirement没有满足,都进不了if语句里面。但是有时会碰到resolver.resolve()返回true时,执行deploy抛出上面的异常的情况。

异常堆栈如下:

java.lang.IllegalStateException: Framework state has changed, must resolve again.

at org.apache.felix.bundlerepository.impl.ResolverImpl.deploy(ResolverImpl.java:500)

。。。。。

原因在ResolverImpl.java的deploy(int)方法中,见如下的代码:

m_repositories[repoIdx].getLastModified()这是每个repository的最后一次的修改时间

m_resolveTimeStamp这是所有repository在执行resolve()方式时初始化的一个时间,这个时间是所有的repository最后修改时间的最大值。

上面的判断是为了确保在执行resolve()方法和deploy(int)方法之间,所有的repository都没有被修改。

而某些特殊情况由于异步执行的原因可能导致某些repository的最后修改时间在执行resolve()后deploy(int)之前被修改。下面是具体的分析:

m_repositories可以分为三种:LocalRepositoryImpl、RepositoryImpl、SystemRepositoryImpl。其中LocalRepositoryImpl实现了SynchronousBundleListener接口和AllServiceListener接口的serviceChanged(ServiceEvent event)方法,由于SynchronousBundleListener是会在bundle安装和卸载时同步调用的,所以只要不异步的安装bundle(通常安装bundle都是通过resolver.deploy(int)方法来安装)就不会出现LocalRepositoryImpl被异步修改的情况的情况; 但是AllServiceListener接口的serviceChanged(ServiceEvent event)方法会在service注册和删除时修改LocalRepositoryImpl的repository最后修改时间,而bundle中的service的安装就不一定是同步的了,比如Felix iPOJO的instance的创建和注册默认情况就是异步进行的,很有可能出现service的注册发生在resolve()后,deploy(int)之前。见LocalRepositoryImpl.java中的代码:

可见如果安装了一个bundle,里面有了ipojo的instance,那么这些instance会被异步的注册到osgi中,上面的方法会被异步的调用,就会导致resolve()后,LocalRepositoryImpl的时间戳被修改,再执行deploy(int)时出现标题中的异常了。

解决办法一:如异常中所说,就是把这个resolver重新resolve一次,如下面的代码:

解决办法二:把ipojo的instance注册方式设置为同步的。ipojo提供了多个渠道可以设置instance同步注册,相关源码详见:org.apache.felix.ipojo.extender.internal.Extender.enablingSynchronousProcessing()方法
方法1:在felix的Framework properties中添加一个参数ipojo.processing.synchronous=true
方法2:在系统参数中添加ipojo.processing.synchronous=true
方法3:在org.apache.felix.ipojo bundle的menifest.mf文件中添加head信息:ipojo-processing-synchronous=true

no manifiest section for signature file entry OSGI-OPT/src/org/osgi/service/device/DriverLocator.java

在使用maven-bundle-plugin在进行osgi bundle开发时,有时mvn install会碰到如下的报错:

错误:构造处理程序对象 no manifiest section for signature file entry OSGI-OPT/src/org/osgi/service/device/DriverLocator.java 时抛出异常

我碰到这个问百思不得其解,由于现在玩osgi的少,在google、stackoverflow上的资料偏少,很难找到解决办法,后来反复尝试,发现只要在pom配置时,保证配置的<Export-Package>其有一个真实存在包路径即可,不能写成*,否则就会报上面的错误;如果这个bundle确实没有package需要被export出去,那么就要写<Private-Package>,且里面要有具体的真实存在包路径或者包路径的通配符。

我用的maven-bundle-plugin是1.4.3版的,不知道后来的版本是否对这方面有改进。

还有类似原因的问题,比如在mvn install的时候出现如下的错误提示:

[WARNING] Warning building bundle ipojo.examples:hello.service:bundle:1.5.0-SNAPSHOT : Instructions for Export-Package that are never used: hello\.service\..*|hello\.service
[WARNING] Warning building bundle ipojo.examples:hello.service:bundle:1.5.0-SNAPSHOT : Superfluous export-package instructions: [hello.service.*]
[WARNING] Warning building bundle ipojo.examples:hello.service:bundle:1.5.0-SNAPSHOT : Did not find matching referal for *
[ERROR] Error building bundle ipojo.examples:hello.service:bundle:1.5.0-SNAPSHOT : The JAR is empty

这个解决方法,也和上面的相同,在maven-bundle-plugin中添加<Export-Package>或者<Private-Package>的配置即可。

 

windows下gvim中文乱码解决方案

网罗了一些网上的解决windows下gvim中文乱码的解决方案,都试了一遍,可惜都不能完全解决我的所有问题,最后我综合一下网上的两种方案,得到了最后完全解决我的中文乱码问题的方案,配置很简单,就是把下面的配置直接copy到C:Program Files (x86)Vim_vimrc文件的开头。(下面第一行配置可以把gvim的字符弄得好看一点)

set guifont=Consolas:h12:cANSI
set encoding=utf-8
set fileencodings=utf-8,chinese
set termencoding=utf-8
if has("win32")
set fileencoding=chinese
else
set fileencoding=utf-8
endif
"解决菜单乱码
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
"解决consle输出乱码
language messages zh_CN.utf-8

终于绑上自己的域名了——www.weager.net

NND,之前弄了好久的sae域名绑定一直没成功,今天在网上搜了个教程试了试,果然有效。教程地址:http://www.chinaz.com/web/2012/0807/267803.shtml

之前没成功的原因是,我把域名的CNAME指向了我在sae上的二级域名weager.sinaapp.com。

其实CNAME应该指向应用设置里面的CNAME地址。

在sae的后台管理界面中,可以看到CNAME的地址,如图:

SAE域名绑定——CNAME绑定
SAE域名绑定——CNAME绑定

然后在域名提供商的管理界面里,设置A记录来验证,验证通过后设置CNAME为上图中的地址:

oray上CNAME的设置
oray上CNAME的设置

稍等一会即可用新域名访问了。

其实我还有一个weager.cn域名的,但是cn域名貌似需要备案后才能使用,这个比较纠结啊,涮鸟,cn域名暂时保留吧

ubuntu下使用gnome-color-chooser更改eclipse提示框背景色

ubuntu/或者类ubuntu系统下默认的tooltip背景色是黑色,所以我们安装了eclipse后提示框的背景色是黑色的,很难看,一般我们都需要修改这个颜色的,比如改成黄色背景。奇怪的是这个背景色不是在eclipse里设置的,而是在ubuntu系统中设置的,网上也有很多解决方案,但是我觉得比较方便的方案是使用gnome-color-chooser来调整eclipse提示框背景色和其他样式搭配。

下面演示一下操作步骤步骤如下:

1. 下载并安装gnome-color-chooser

sudo apt-get install gnome-color-chooser

2. 设置tooltip的前景色和背景色

用ubuntu系统样式和颜色调节器来修改eclipse提示框背景色
用ubuntu系统样式和颜色调节器来修改eclipse提示框背景色

打开gnome-color-chooser程序,如上图中的设置,在“特定的”里面,你可以随意搭配你的小提示的前景和背景。我这里设置的是提示框内文字用黑色,背景用黄色。

当然这个gnome-color-chooser的功能不仅仅是调提示框的样式,它还可以调整这个GNOME系统界面的样式,感兴趣的可以依依尝试。

用TortoiseSVN chekout的代码不能在eclipse中被subclipse识别的问题

之前一直用tortoiseSVN来checkout、update、commit代码,但是eclipse的subclipse插件那么好用,可惜我的eclipse插件subclipse不能识别tortoiseSVN签出的代码目录中已经有.svn目录。百度了好几把,没找到比较好的方案,于是自己摸索了一下subclipse的功能,发现其中有个share project的功能可以解决这个问题。

有如下的四个步骤:

1. 在多个project或者整个work set上右键–>Team–>Share Project

右键,查看Team
右键,查看Team

2. 选择svn:

选择svn进行关联
选择svn进行关联

3. 选择需要与svn关联的工程:

选择工程进行关联
选择工程进行关联

4. 验证与svn的关联

将项目链接至资源库
将项目链接至资源库

5. 关联完成,稍等片刻后,工程会逐一与svn资源库关联上,然后就能在每个工程、文件夹、文件后面看到资源和版本信息了。

 

ubuntu 12.04 LTS 版eclipse svn插件subclipse安装报Failed to load JavaHL Library错误

在Ubuntu 12.04 下, eclipse svn插件subclipse安装一般会遇到两个问题:

1)Failed to load JavaHL Library.

These are the errors that were encountered:
no libsvnjavahl-1 in java.library.path
no svnjavahl-1 in java.library.path
no svnjavahl in java.library.path
java.library.path = /usr/lib/jni

这里有官方的解决这个问题的指导:http://subclipse.tigris.org/wiki/JavaHL

按照以前的装法

1、sudo apt-get install libsvn-java

该命令会产生libsvnjavahl-1.so文件。

(64位操作系统该文件在/usr/lib/x86_64-linux-gnu/jni/目录下,如果是32位操作体系则在/usr/lib/i386-linux-gnu/jni/目录下。

2、eclipse.ini中增加参数(该文件在eclipse目录中)

-vmargs
-Dosgi.requiredJavaVersion=1.5
-Djava.library.path=/usr/lib/jni

其实eclipse默认使用的library path就是/usr/lib/jni目录,该目录下还有其他java native的实现。所以不能为了解决subclipse的问题,而修改-Djava.library.path的值,应该把需要的文件软链接到默认的library path下(即/usr/lib/jni下)。所以请按照第三步来做。

3、把libsvnjavahl-1.so文件软链接到/usr/lib/jni下

64位操作系统请用这个命令:

sudo ln -s /usr/lib/x86_64-linux-gnu/jni/libsvnjavahl-1.so /usr/lib/jni/libsvnjavahl-1.so

32位操作系统请用这个命令:

sudo ln -s /usr/lib/i386-linux-gnu/jni/libsvnjavahl-1.so /usr/lib/jni/libsvnjavahl-1.so

4、重启eclipse

2) ubuntu Incompatible JavaHL library loaded.  1.7.x or later required

JavaHL 版本过低错误,Ubuntu 12.04中,通过 $ apt-get install libsvn-java 命令安装的版本是1.6.x

如果你的eclipse是3.7.2 默认安装的subclipse 是 1.8.x 版本的,他要求 JavaHL 是 1.7 以上。

所以需要先卸载你刚安装的libsvn-java,然后再安装1.7版的libsvn-java,使用如下的命令安装:

sudo apt-get purge libsvn-java

sudo add-apt-repository ppa:dominik-stadler/subversion-1.7

sudo apt-get update sudo apt-get install libsvn-java

安装完成后,重启,稍等一会,如果没弹出报错的对话框,则成功了;如果弹出对话框说有bug需要把xxxx的功能禁用掉,那你可以直接点ok,重启后试试subclipse的功能,如果没问题就ok了。

如果重启后还是报错,就需要你卸载掉 subclipse  换成 1.6.x 版本了(http://subclipse.tigris.org/update_1.6.x)。

修改自海波无痕 本文链接地址: ubuntu 12.04 LTS 版eclipse svn报Failed to load JavaHL Library

错误: Could not read CAPTCHA token file.There is a problem with the directory /si-captcha-for-wordpress/captcha/temp/.The directory is not found, a permissions problem may have prevented this directory from being created.

在自己的wordpress博客上安装了“si-captcha-for-wordpress”,并在该插件设置中设置了登录需要验证码,然后我自己退出后再尝试登录,结果发现怎么输入验证码都显示如下的错误:错误: Could not read CAPTCHA token file.There is a problem with the directory /si-captcha-for-wordpress/captcha/temp/.The directory is not found, a permissions problem may have prevented this directory from being created. Fixing the actual problem is recommended, but you can uncheck this setting on the si captcha options page: “Use CAPTCHA without PHP session” and the captcha will work this way just fine (as long as PHP sessions are working).

我自己把代码checkout出来,先尝试在/si-captcha-for-wordpress/captcha目录下添加了temp目录,commit以后,还是登录不进去,并且报一个有关权限的错误,但是sinaapp根本就不能设置访问权限的,所以基本判断,这个插件还是存在一定的兼容性问题。

最后没招了,只能把代码中的wp-contentplugins目录下的si-captcha-for-wordpress文件夹删除,删除后commit代码,然后尝试登录博客,登录成功,在控制台中进入插件管理界面,提示si-captcha-for-wordpress插件已经被禁用,但是找不到si-captcha-for-wordpress插件目录。

为了保证博客程序运行不要老是抛错,既然si-captcha-for-wordpress已经被禁用了,我于是又在代码中把si-captcha-for-wordpress目录还原了,再登录博客进入控制台,删除这个插件,就正常了。

后来我发现了一个验证码的插件,很不错的,推荐一下:Captcha plugin,我现在用的就是这个。

eclipse远程debug启动报错:JDWP exit error AGENT_ERROR_TRANSPORT_INIT(197): No transports initialized [../../../src/share/back/debugInit.c:741]

参考http://1985wanggang.blog.163.com/blog/static/776383320120384555181/http://1985wanggang.blog.163.com/blog/static/776383320120384555181/上面的eclipse远程debug配置方式,发现如果在eclipse中关掉debug进程和远程的应用进程后,不能再启动应用了,报了如下的错:

FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_INIT(197)
ERROR: transport error 202: bind failed: Address already in use
ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)
JDWP exit error AGENT_ERROR_TRANSPORT_INIT(197): No transports initialized [../../../src/share/back/debugInit.c:741]

后来才发现任务管理器中有个java.exe的进程,这个进程就是jetty容器进程。手动杀掉这个进程后,才可以重新启动应用和debug功能。

网上有一些解决方法:

1. 设置hosts文件127.0.0.1与localhost的映射

2. 打开防火墙,让javaw.exe可以访问网络

3. 重启eclipse或者重启电脑

以上的几种方法都试过了,都不管用。

还是自己研究,经查,原来是很弱的原因:

关闭这个jetty的进程java.exe不是通过关闭jetty容器来实现的,而是用eclipse debug的客户端来关闭的。

解决方案:

在菜单栏Run–>Debug Configurations–>然后选择你的remote java application–>connect中有一个Allow termination of remote VM的复选框,勾上这个就行了。

然后启动了jetty容器后,再启动debug,此时就可以terminate debug来关闭jetty容器的进程了。(注意:不能直接在启动了jetty容器后,点Terminate来关闭jetty,这样不能关闭jetty,因为它是一个后台运行的java.exe进程在运行jetty容器,只能通过jpda的debug方式来远程关闭jetty容器,或者在任务管理器中干掉java.exe进程)

Eclipse Indigo中发生Unable to load default SVN client错误

可能大家在安装SVN的时候会出现“Unable to load default SVN client错误”,不要紧张,那是你机器上没有 JAVAHL 这个包, 这个是另外的一个开源组件。

最简单的解决办法:

其他解决方案:

官方参考:http://subclipse.tigris.org/wiki/JavaHL#head-7498d204a5be83e0e97d196ba75fc797d5f0c822