BaNg

Just Do It!

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  8 Posts :: -1 Stories :: 26 Comments :: 0 Trackbacks

2008年4月23日 #

一般在Windows的软件大部分安装在c:\ Program Files下面,比如我机器上的Java位置就是C:\Program Files\Java\jdk1.5.0_12,假如如果你在批处理中调用java或者javaw,会这么写:

set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_12
set EXE_JAVA=%JAVA_HOME%\bin\java
%EXE_JAVA% -version

那样会报告一个错误:
'C:\Program' 不是内部或外部命令,也不是可运行的程序
或批处理文件。


以前为了避免这种问题,会把把JDK挪到c:\,但不是一个通用的解决办法,现在可以采用两种方式来解决:

1 加上引号,表示一个完整路径,这个在好多服务器批处理中常用到比如jboss,  tomcat。
set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_12
set EXE_JAVA="%JAVA_HOME%"\bin\java
%EXE_JAVA% -version

2 转成短路径,这个我认为是最好的解决办法。
set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_12
for %x in ("%JAVA_HOME%") do set JAVA_HOME=%~sx
set EXE_JAVA=%JAVA_HOME%\bin\java
%EXE_JAVA% -version

需要注意的是,在批处理文件比如 run.bat 中,上面的for语句的变量有两个%%号。
for %%x in ("%JAVA_HOME%") do set JAVA_HOME=%%~sx




posted @ 2008-04-23 15:04 Always BaNg. 阅读(910) | 评论 (6)编辑 收藏

2008年4月13日 #

我平常做服务器或者应用程序的时候喜欢把各种依赖包如log4j, jdbc, commons-lang等放到一个lib目录下,然后启动的时候将这些jar包设置到classpath上。以前我经常使用set classpath=log4j.jar;jdbc.jar;commons-lang.jar硬加载,但问题就是每新加入一个jar,就得改批处理一次,再就是每开发一个就得这么设置一次。很烦人,perl 创始人说,偷懒的程序员才是好程序员:),我需要一个通用的加载方式。

不管linux/windows或其它OS,都提供一个shell与kernel交互,并且shell都有一个类似的for内置commnd。

下面是linux bash的尝试
#!/usr/bin/sh

clspath
="bootstrap.jar"
for k in *.jar
do
 clspath
=$clspath:$PWD/$k
 echo 
"current jar is $k."
done
printf "classpath is %s" $clspath

工作的很好,于是在windows同样try了一下batch
@echo off

set clspath
=bootstrap.jar
for %%j in (*.jar) do (
set clspath
=%clspath%;%cd%\%%j
echo current jar is 
%%j.
)
echo classpath is 
%clspath%

很奇怪的是最后的结果却是 classpath is bootstrap.jar;D:\workflow\bingo\lib\servlet-api.jar。很显然batch默认不支持变量迭代更改
google了一下,发现原因,稍微改一下:
 
 1@echo off
 2
 3set clspath=bootstrap.jar
 4setlocal enabledelayedexpansion
 5for %%j in (*.jar) do (
 6set clspath=!clspath!;%cd%\%%j
 7echo current jar is %%j.
 8)
 9echo classpath is %clspath%
10endlocal


对比一下,可以发现:

  1. 第4行加上了setlocal enabledelayedexpansion,即变量延迟展开。
  2. 第10行有一个endlocal,结束这个设置
  3. 第6行把%classpath%变成了!classpath!。

虽然目的达到了,还是要鄙视微软的dos batch,实在很弱,不知Powershell怎样。

参考资料:
   setlocal


 

posted @ 2008-04-13 15:32 Always BaNg. 阅读(905) | 评论 (7)编辑 收藏

2008年4月11日 #

插件源代码下载 (导入插件在workspace中,右键export->Plug-in Development->Deployable plug-ins and fragments,然后生成插件binar文件)
二进制包下载   (因为blogjava不许上传jar文件,请下载后将zip后缀改为jar后缀然后拷贝到eclipse/plugins目录)


一般在使用Eclipse过程中会有两种跟文件编码(charset)有关的情况让我们不愉快。

1 导入一个项目。
  假设你的同事做好了一个项目,为了更好的支持国际化,里面的jsp页面都采用UTF-8,然后发给你,你导入到Eclipse的workspace中,一般情况下,在Eclipse中,这些jsp都变成了GBK编码,你双击打开,一堆乱码。假设你知道原因,稍微如下设置一下可以解决问题:


(图1 设置文件编码)
但是,这个项目可能包含1000个jsp文件,且你还可能反反复复碰到这个问题,真是一个体力活。

2 改变一个项目文件的编码
这种情况发生比较少,但发生了就是一个大难题。比如公司有两个团队,一个开发的项目jsp采用UTF-8编码,另外一个采用GBK编码。一段时间之后,需要整合两个项目,jsp页面只能采用一种编码,UTF-8/GBK或其它。有经验的人知道这是一个拷贝/设置编码/粘贴的过程:
 2.1 将某个jsp的内容全部拷贝下来。
 2.2 如图1所示将编码设置为统一编码如UTF-8。
 2.3 把设置过编码的jsp文件清空,然后粘贴。
 好像解决问题很完美,但是Eclipse没有宏,如果文件很多,比如2000个,将是一个恐怖的任务。

因为这两个问题老是反复的困扰着我的同事,相信也困扰了不少Java开发者,Eclipse转码插件很好很方便的解决了这个问题,它基于Eclipse 3.3开发,所以编译环境最好采用Eclipse 3.3。

下面是使用步骤

step1. 将插件com.lifesting.tool.encoding_1.0.0.jar拷贝到eclipse/plugins目录下,重启Eclipse。

step2. 选择某个项目,右键选择properties,然后点击Convert Setting进行转码规则设置,如下图:

(图2 项目转码规则设置)
这个表格有四列,分别是文件后缀文件目前编码转换后的编码是否转换文件内容,如果转换文件内容,那么对应的是前面所说的第二种情况,不转换文件内容对应的是第一种情况。比如图2的转码规则就是对项目的jsp文件,不管原来是什么编码,统一转为UTF-8编码,并且同时转换文件内容。可以点击右边的Add /Remove按钮来增加/删除规则。最后点击Apply来保存设置。

step3. 转码
 在设置了转码规的项目上,右键选择项目,某几个文件夹或某几个文件(当然一个也可以),然后点击Lifesting Tools->Set Encoding。插件将完成转码工作。如果我们选择的是项目,将转换整个项目;如果选择的是文件夹,转换文件夹下所有满足规则的文件;如果选择的是文件,只转换文件。

(图3 转码)
除了这方式外,我们还可以利用Eclipse的文件搜索功能,将搜到的文件进行转码,如下图:

(图4 在search view里转码)
如上图所示,我们搜到了整个workspace的jsp文件,然后点击绿色E小图标,插件将会把所有满足结果的文件转码,每个文件的转换规则依赖它所属项目的转码规则设置。

posted @ 2008-04-11 18:54 Always BaNg. 阅读(1025) | 评论 (7)编辑 收藏

2008年4月2日 #


Maven有自己的一套约定目录规则,与MyEclipse的有冲突,其实结合也很简单,因为MyEclipse的目录可配置。

1 用maven创建一个web project
 mvn archetype:create   -DgroupId=com.lifesting  -DartifactId=test  -DarchetypeArtifactId=maven-archetype-webapp

2 补全某些目录
 cd test\src
 mkdir main\java
 mkdir test\resources
 mkdir test\java

3 修改pom文件,在生成eclipse项目的时候maven eclipse plugin使用此配置
  在project/build下面插入
<plugins> 
    
<plugin> 
      
<groupId>org.apache.maven.plugins</groupId> 
      
<artifactId>maven-eclipse-plugin</artifactId> 
      
<configuration> 
         
<projectnatures> 
            
<java.lang.String>com.genuitec.eclipse.j2eedt.core.webnature</java.lang.String> 
            
<java.lang.String>org.eclipse.jdt.core.javanature</java.lang.String> 
          
</projectnatures> 
          
<outputDirectory>src/main/webapp/WEB-INF/classes</outputDirectory> 
      
</configuration> 
    
</plugin> 
  
</plugins> 
project nature是eclipse开发中一个概念,比如加入javanature就表示此项目是一个java project,会绑定一个java builder用来编译java文件,而webnature告诉MyEclipse这是一个MyEclipse web项目,更多MyEclipse projectNature:
webservice-- com.genuitec.eclipse.ws.xfire.wsnature
facelet-- com.genuitec.eclipse.jsf.faceletsnature
jsf--com.genuitec.eclipse.jsf.jsfnature
struts--com.genuitec.eclipse.cross.easystruts.eclipse.easystrutsnature
或者在插件里面使用这个方法:
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("test");
        
try {
            String[] natures 
= project.getDescription().getNatureIds();
            
for (String nature :natures)
                System.out.println(nature);
        }
 catch (CoreException e) {
            e.printStackTrace();
        }
可以将项目所有的nature打印出来

outputDirectory主要是告诉maven eclipse plugin编译输出在什么位置,默认在target/classes下面,web项目不同,应该放在src/main/webapp/WEB-INF/classes 才能够被MyEclipse package到服务器。

4 在命令行test目录下运行mvn eclipse:eclipse生成Eclipse项目。

5 在MyEclipse中将test project 导入到workspace,MyEclipse通过projectNature识别到test是一个MyEclipse web project,它会在项目目录下生成一个.mymetadata文件。再关闭MyEclipse,这么做的原因是因为默认MyEclipse的webRoot不可配置。

6 修改MyEclipse下面的.mymetadata文件,比如我的test项目文件内容为
<?xml version="1.0" encoding="UTF-8"?>
<project-module
  
type="WEB"
  name
="test"
  id
="myeclipse.1207117121765"
  j2ee-spec
="1.4"
  archive
="test.war">
  
<attributes>
    
<attribute name="webrootdir" value="/WebRoot" />
  
</attributes>
</project-module>
增加一行,修改一行为:
<?xml version="1.0" encoding="UTF-8"?>
<project-module
  
type="WEB"
  name
="test"
  id
="myeclipse.1207117121765"
  context-root
="/test""
  j2ee-spec
="1.4"
  archive
="test.war">
  
<attributes>
    
<attribute name="webrootdir" value="/src/main/webapp" />
  
</attributes>
</project-module>

可以看到,增加的一行 context-root="/test" 表示web的上下文为test.
修改的一行为webrootdir的值,将/WebRoot改为maven默认的web项目source目录/src/main/webapp。

7 重新启动MyEclipse,一切搞定了,调试开发两不误。

参考资料
http://www.myeclipseide.com/PNphpBB2-viewtopic-t-17416.html
posted @ 2008-04-02 14:32 Always BaNg. 阅读(1000) | 评论 (0)编辑 收藏

2008年3月31日 #

下载插件源代码(eclipse 3.3)

下载eclipse 3.2 binary下载后改后缀zip为jar,然后放到eclipse/plugins目录

eclipse内置一个properties editor但是只支持latin-1编码,调用native2ascii太麻烦,sourceforge上有一个很强大的properties editor,日本人搞得,肯定支持中文了,但是版本太老,3.1,还有很多没有什么多大用处的swing, jbuild支持等,我稍微改了一下,做了一个最小化的编辑器。

严正申明,此软件属于研究性质,版权属于原作者:http://propedit.sourceforge.jp/index_en.html

效果:



下载后将工程导入到workspace中,export成plugin即可。

posted @ 2008-03-31 14:10 Always BaNg. 阅读(1040) | 评论 (6)编辑 收藏

起因:
每个svn目录都有一个.svn目录包含svn元数据信息。一个项目的svn数据很是庞大,打包的时候需要删除。

解决方案:

使用cygwin命令

find . -type d -name ".svn" | xargs rm -rf
posted @ 2008-03-31 13:34 Always BaNg. 阅读(60) | 评论 (0)编辑 收藏

起因:
遍历所有项目目录,在每个项目下执行mvn eclipse:clean和mvn clean。

解决方案:

 find . -maxdepth 1 -type d -exec bash -c "cd {} && mvn eclipse:clean && mvn clean && cd .." \;
posted @ 2008-03-31 13:29 Always BaNg. 阅读(49) | 评论 (0)编辑 收藏

起因:

把continuum.war解压缩到jboss deploy下部署,当continuum build项目的时候不能发送邮件,修改配置,发送邮件失败

解决方案:

1 不能发送邮件
打开continuum.war下WEB-INF/classes/META-INF/plexus/application.xml,定位到注释"The mail notifier",修改configuration下节点<alwaysSend>值为true

2 发送邮件失败,提示无法通过验证。
通过分析continuum源代码得知,为支持smtps和tls,发送邮件使用Transport send方法要从mail session中获得配置的用户名和密码,而由于continuum使用的是jboss 的mail-service.xml配置的mail session,但这个jboss初始化的mail session factory session不包括user和password的配置信息,jboss更倾向于我们使用Transport.send(Message)来发送邮件。解决这个矛盾的方法就是在mail-service.xml加入配置信息,可以解决问题,美中不足的就是有两套用户名/密码配置,配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- $Id: mail-service.xml 62349 2007-04-15 16:48:15Z dimitris@jboss.org $ -->
<server>

  <mbean code="org.jboss.mail.MailService"
         name="jboss:service=Mail">
    <attribute name="JNDIName">java:/Mail</attribute>
    <attribute name="User">chenbangyi@corp.leadtone.com</attribute>
    <attribute name="Password">hidden</attribute>
    <attribute name="Configuration">
      <!-- A test configuration -->
      <configuration>
        <!-- Change to your mail server prototocol -->
        <property name="mail.store.protocol" value="pop3"/>
        <property name="mail.transport.protocol" value="smtp"/>

        <!-- Change to the user who will receive mail  -->
        <property name="mail.user" value="chenbangyi@corp.leadtone.com"/>

        <!-- Change to the mail server  -->
        <property name="mail.pop3.host" value="corp.leadtone.com"/>

        <!-- Change to the SMTP gateway server -->
        <property name="mail.smtp.host" value="corp.leadtone.com"/>
       
        <!-- The mail server port -->
        <property name="mail.smtp.port" value="25"/>
       
        <!-- Change to the address mail will be from  -->
        <property name="mail.from" value="chenbangyi@corp.leadtone.com"/>
        
      <property name="mail.smtp.auth" value="true"/>
    <property name="mail.smtp.user" value="chenbangyi"/>
    <property name="password" value="hidden"/>

        <!-- Enable debugging output from the javamail classes -->
        <property name="mail.debug" value="true"/>
      </configuration>
    </attribute>
    <depends>jboss:service=Naming</depends>
  </mbean>

</server>

如果发送需要验证,使用黑体配置。

posted @ 2008-03-31 13:21 Always BaNg. 阅读(42) | 评论 (0)编辑 收藏