跳到导航
dev2dev.bea.com.cn
首页 资源中心 dev2dev学堂 在线技术论坛 专家Blog User Group CodeShare
dev2dev 首页 > 资源中心 > 专家Blog > 专家Blog文章
WebLogic Develop Tools精华帖整理

时间:2005-09-09
作者:肖菁
浏览次数:
本文关键字:开发工具Ant JBuilder Eclipse workshop
文章工具
推荐给朋友 推荐给朋友
打印文章 打印文章
开发工具选择 商用集成开发工具 Workshop

随着weblogic服务器发布的开发工具,适用于开发部署在weblogic平台上的J2EE应用,可以开发基于PageFlow的web应用、ejb应用、web服务等J2EE应用,还可以开发工作流、Portal等。

WSXX

WSXX其实是IBM提供的一个开发J2EE及基于J2EE的工作流、Portal的工具序列,包括了WSAD、WSSD等,根据不同的开发目的可以选择其中的一个开发工具,比如J2EE应用级的开发选择WSAD,Web应用级的开发选择WSSD。

SUN ONE Studio

SUN公司提供的完整J2EE开发用IDE,界面和处理方面借鉴了很多Unix系统方面的好东西,适合熟悉Unit的人用。

Jbuilder

这是以前国内普遍采用的开发工具,然而随着各家中间件厂商推出自己的开发工具,Jbuilder和这些中间件之间的配合问题日益突出,建议尽量不要采用

Jdeveloper

Oracle公司的开发工具,如果使用Oracle的中间件,还是用这个吧。

intellij idea

国内比较少采用的J2EE开发工具,在2004sun举办的开发者交流日应该是第一次公开发行,参加那次会议的人应该拿到了他的试用版光盘。

开源类开发工具 Eclipse

IBM将WSAD的基本框架开源化就形成了Eclipse,而且全世界的爱好者(包括作者在内)给他提供了各种各样的插件使他成为一个非常好的开发工具(不仅限于J2EE),而且插件的数量还在增加中。

NetBeans

SUN公司提供的开源开发工具,有官方提供的中文版本哦。

 

如果你足够牛,当然可以选择使用文本类的编辑工具如EditPlus等,呵呵。

学习用开发J2EE时框架、开发工具选择的建议
  • Web层开发框架-Struts(http://struts.apache.org/)

Web层开发框架现在都MVC了,所以考虑到Apache现在的地位和人们对于Struts的认识,这个应该是首选了。

最好刚学习的时候就让自己进入这种思维,不然搞了很久的基于jsp的开发后回来理解这个东西还真的有困难!

  • 开发工具-eclipse(www.eclipse.org)

好用的工具很多,不过综合考虑学习时的要求,还是这个东西比较合适。

A)配置简单,而且各平台基本通用

B)标准安装的时候向导不多,所以逼着你去了解J2EE编程的机制和原理,我们这里有的人GUI用多了,问他J2EE中Web应用的目录结构是什么样子都不知道。

C)慢慢熟悉了,可以增加需要的控件来学习,其他的GUI一下子给了太多的东西,不知道从哪个地方下手。

D)可以无缝集成Ant、JUnit

  • 单元测试工具-junit(http://www.junit.org/index.htm)

junit应该是目前java世界中最常用的单元测试框架了,而且eclipse内置支持生成JUnit的TestCase,这对于大量的测试代码生成的效率提高有很大的帮助。

  • 简单集成测试工具-httpunit(http://sourceforge.net/projects/httpunit/)
  • 测试信息输出-log4j(http://logging.apache.org/log4j/docs/download.html)
  • 开发用J2EE容器-Apusic(www.apusic.com)

可能大家都会想起JBoss,我推荐的是深圳金蝶的Apusic 3,好处当然有很多(先声明本人绝非金蝶的员工):

A)目前唯一通过J2EE兼容性测试的国内中间件(国家现在很多工程都要求采用国产软件,将来Apusic可能是国内最早、最适用的中间件产品哦,不先来一下?)

B)Apusic比JBoss更接近J2EE标准,提供的管理方式也比JBoss更接近商用J2EE服务器如weblogic、websphere

C)Apusic服务器启动速度很快,尤其是开发Struts应用的情况下,体现的更为明显,因为struts开发中的很多修改都需要重新启动服务器或者web应用,而Apusic服务器启动的时间很短哦。

工具使用 Ant Ant基本使用指南

1 Ant是什么?

Apache Ant 是一个基于 Java的生成工具。

生成工具在软件开发中用来将源代码和其他输入文件转换为可执行文件的形式(也有可能转换为可安装的产品映像形式)。随着应用程序的生成过程变得更加复杂,确保在每次生成期间都使用精确相同的生成步骤,同时实现尽可能多的自动化,以便及时产生一致的生成版本

2下载、安装Ant

安装Ant

下载.zip文件,解压缩到c:\ant1.3(后面引用为%ANT_HOME%)

 

2.1在你运行Ant之前需要做一些配置工作。

·将bin目录加入PATH环境变量。

·设定ANT_HOME环境变量,指向你安装Ant的目录。在一些OS上,Ant的脚本可以猜测ANT_HOME(Unix和Windos NT/2000)-但最好不要依赖这一特性。

·可选地,设定JAVA_HOME环境变量(参考下面的高级小节),该变量应该指向你安装JDK的目录。

注意:不要将Ant的ant.jar文件放到JDK/JRE的lib/ext目录下。Ant是个应用程序,而lib/ext目录是为JDK扩展使用的(如JCE,JSSE扩展)。而且通过扩展装入的类会有安全方面的限制。

2.2运行Ant

运行Ant非常简单,当你正确地安装Ant后,只要输入ant就可以了。

 

没有指定任何参数时,Ant会在当前目录下查询build.xml文件。如果找到了就用该文件作为buildfile。如果你用 -find 选项。Ant就会在上级目录中寻找buildfile,直至到达文件系统的根。要想让Ant使用其他的buildfile,可以用参数 -buildfile file,这里file指定了你想使用的buildfile。

 

可以指定执行一个或多个target。当省略target时,Ant使用标签<project>的default属性所指定的target。

 

 

命令行选项总结:

ant [options] [target [target2 [target3] ...]]

Options:

-help print this message

-projecthelp print project help information

-version print the version information and exit

-quiet be extra quiet

-verbose be extra verbose

-debug print debugging information

-emacs produce logging information without adornments

-logfile file use given file for log output

-logger classname the class that is to perform logging

-listener classname add an instance of class as a project listener

-buildfile file use specified buildfile

-find file search for buildfile towards the root of the filesystem and use the first one found

-Dproperty=value set property to value

例子

ant

使用当前目录下的build.xml运行Ant,执行缺省的target。

ant -buildfile test.xml

使用当前目录下的test.xml运行Ant,执行缺省的target。

ant -buildfile test.xml dist

使用当前目录下的test.xml运行Ant,执行一个叫做dist的target。

ant -buildfile test.xml -Dbuild=build/classes dist

使用当前目录下的test.xml运行Ant,执行一个叫做dist的target,并设定build属性的值为build/classes。

 

3编写build.xml

Ant的buildfile是用XML写的。每个buildfile含有一个project。

 

buildfile中每个task元素可以有一个id属性,可以用这个id值引用指定的任务。这个值必须是唯一的。(详情请参考下面的Task小节)

 

3.1Projects

 

project有下面的属性:

AttributeDescriptionRequired

name项目名称.No

default当没有指定target时使用的缺省targetYes

basedir用于计算所有其他路径的基路径。该属性可以被basedir property覆盖。当覆盖时,该属性被忽略。如果属性和basedir property都没有设定,就使用buildfile文件的父目录。No

项目的描述以一个顶级的<description>元素的形式出现(参看description小节)。

 

一个项目可以定义一个或多个target。一个target是一系列你想要执行的。执行Ant时,你可以选择执行那个target。当没有给定target时,使用project的default属性所确定的target。

 

3.2Targets

 

一个target可以依赖于其他的target。例如,你可能会有一个target用于编译程序,一个target用于生成可执行文件。你在生成可执行文件之前必须先编译通过,所以生成可执行文件的target依赖于编译target。Ant会处理这种依赖关系。

 

然而,应当注意到,Ant的depends属性只指定了target应该被执行的顺序-如果被依赖的target无法运行,这种depends对于指定了依赖关系的target就没有影响。

 

Ant会依照depends属性中target出现的顺序(从左到右)依次执行每个target。然而,要记住的是只要某个target依赖于一个target,后者就会被先执行。

<target name="A"/>

<target name="B" depends="A"/>

<target name="C" depends="B"/>

<target name="D" depends="C,B,A"/>

假定我们要执行target D。从它的依赖属性来看,你可能认为先执行C,然后B,最后A被执行。错了,C依赖于B,B依赖于A,所以先执行A,然后B,然后C,最后D被执行。

 

一个target只能被执行一次,即时有多个target依赖于它(看上面的例子)。

 

如果(或如果不)某些属性被设定,才执行某个target。这样,允许根据系统的状态(java version, OS, 命令行属性定义等等)来更好地控制build的过程。要想让一个target这样做,你就应该在target元素中,加入if(或unless)属性,带上target因该有所判断的属性。例如:

<target name="build-module-A" if="module-A-present"/>

<target name="build-own-fake-module-A" unless="module-A-present"/>

如果没有if或unless属性,target总会被执行。

 

可选的description属性可用来提供关于target的一行描述,这些描述可由-projecthelp命令行选项输出。

 

将你的tstamp task在一个所谓的初始化target是很好的做法,其他的target依赖这个初始化target。要确保初始化target是出现在其他target依赖表中的第一个target。在本手册中大多数的初始化target的名字是"init"。

 

target有下面的属性:

AttributeDescriptionRequired

nametarget的名字Yes

depends用逗号分隔的target的名字列表,也就是依赖表。No

if执行target所需要设定的属性名。No

unless执行target需要清除设定的属性名。No

description关于target功能的简短描述。No

 

3.3Tasks

 

一个task是一段可执行的代码。

 

一个task可以有多个属性(如果你愿意的话,可以将其称之为变量)。属性只可能包含对property的引用。这些引用会在task执行前被解析。

 

下面是Task的一般构造形式:

<name attribute1="value1" attribute2="value2" ... />

这里name是task的名字,attributeN是属性名,valueN是属性值。

 

有一套内置的(built-in)task,以及一些可选task,但你也可以编写自己的task。

 

所有的task都有一个task名字属性。Ant用属性值来产生日志信息。

 

可以给task赋一个id属性:

<taskname id="taskID" ... />

这里taskname是task的名字,而taskID是这个task的唯一标识符。通过这个标识符,你可以在脚本中引用相应的task。例如,在脚本中你可以这样:

<script ... >

task1.setFoo("bar");

</script>

设定某个task实例的foo属性。在另一个task中(用java编写),你可以利用下面的语句存取相应的实例。

project.getReference("task1").

注意1:如果task1还没有运行,就不会被生效(例如:不设定属性),如果你在随后配置它,你所作的一切都会被覆盖。

 

注意2:未来的Ant版本可能不会兼容这里所提的属性,因为很有可能根本没有task实例,只有proxies。

 

3.4Properties

 

一个project可以有很多的properties。可以在buildfile中用property task来设定,或在Ant之外设定。一个property有一个名字和一个值。property可用于task的属性值。这是通过将属性名放在"{"和"}"之间并放在属性值的位置来实现的。例如如果有一个property builddir的值是"build",这个property就可用于属性值:{builddir}/classes。这个值就可被解析为build/classes。

内置属性

 

如果你使用了<property> task 定义了所有的系统属性,Ant允许你使用这些属性。例如,{os.name}对应操作系统的名字。

 

要想得到系统属性的列表可参考the Javadoc of System.getProperties。

 

除了Java的系统属性,Ant还定义了一些自己的内置属性:

basedir project基目录的绝对路径 (与<project>的basedir属性一样)。

ant.file buildfile的绝对路径。

ant.version Ant的版本。

ant.project.name 当前执行的project的名字;由<project>的name属性设定.

ant.java.version Ant检测到的JVM的版本;目前的值有"1.1", "1.2", "1.3" and "1.4".

例子

<project name="MyProject" default="dist" basedir=".">

 

<!-- set global properties for this build -->

<property name="src" value="."/>

<property name="build" value="build"/>

<property name="dist" value="dist"/>

<target name="init">

<!-- Create the time stamp -->

<tstamp/>

<!-- Create the build directory structure used by compile -->

<mkdir dir="{build}"/>

</target>

<target name="compile" depends="init">

<!-- Compile the java code from {src} into {build} -->

<javac srcdir="{src}" destdir="{build}"/>

</target>

<target name="dist" depends="compile">

<!-- Create the distribution directory -->

<mkdir dir="{dist}/lib"/>

<!-- Put everything in {build} into the MyProject-{DSTAMP}.jar file -->

<jar jarfile="{dist}/lib/MyProject-{DSTAMP}.jar" basedir="{build}"/>

</target>

<target name="clean">

<!-- Delete the {build} and {dist} directory trees -->

<delete dir="{build}"/>

<delete dir="{dist}"/>

</target>

</project>

 

3.5Path-like Structures

你可以用":"和";"作为分隔符,指定类似PATH和CLASSPATH的引用。Ant会把分隔符转换为当前系统所用的分隔符。

 

当需要指定类似路径的值时,可以使用嵌套元素。一般的形式是

<classpath>

<pathelement path="{classpath}"/>

<pathelement location="lib/helper.jar"/>

</classpath>

location属性指定了相对于project基目录的一个文件和目录,而path属性接受逗号或分号分隔的一个位置列表。path属性一般用作预定义的路径--其他情况下,应该用多个location属性。

 

为简洁起见,classpath标签支持自己的path和location属性。所以:

<classpath>

<pathelement path="{classpath}"/>

</classpath>

可以被简写作:

<classpath path="{classpath}"/>

也可通过<fileset>元素指定路径。构成一个fileset的多个文件加入path-like structure的顺序是未定的。

<classpath>

<pathelement path="{classpath}"/>

<fileset dir="lib">

<include name="**/*.jar"/>

</fileset>

<pathelement location="classes"/>

</classpath>

上面的例子构造了一个路径值包括:{classpath}的路径,跟着lib目录下的所有jar文件,接着是classes目录。

 

如果你想在多个task中使用相同的path-like structure,你可以用<path>元素定义他们(与target同级),然后通过id属性引用--参考Referencs例子。

 

path-like structure可能包括对另一个path-like structurede的引用(通过嵌套<path>元素):

<path id="base.path">

<pathelement path="{classpath}"/>

<fileset dir="lib">

<include name="**/*.jar"/>

</fileset>

<pathelement location="classes"/>

</path>

<path id="tests.path">

<path refid="base.path"/>

<pathelement location="testclasses"/>

</path>

前面所提的关于<classpath>的简洁写法对于<path>也是有效的,如:

<path id="tests.path">

<path refid="base.path"/>

<pathelement location="testclasses"/>

</path>

可写成:

<path id="base.path" path="{classpath}"/>

命令行变量

 

有些task可接受参数,并将其传递给另一个进程。为了能在变量中包含空格字符,可使用嵌套的arg元素。

AttributeDescriptionRequired

value一个命令行变量;可包含空格字符。只能用一个

line空格分隔的命令行变量列表。

file作为命令行变量的文件名;会被文件的绝对名替代。

path一个作为单个命令行变量的path-like的字符串;或作为分隔符,Ant会将其转变为特定平台的分隔符。

 

例子

<arg value="-l -a"/>

是一个含有空格的单个的命令行变量。

<arg line="-l -a"/>

是两个空格分隔的命令行变量。

<arg path="/dir;/dir2:\dir3"/>

是一个命令行变量,其值在DOS系统上为\dir;\dir2;\dir3;在Unix系统上为/dir:/dir2:/dir3 。

 

References

 

buildfile元素的id属性可用来引用这些元素。如果你需要一遍遍的复制相同的XML代码块,这一属性就很有用--如多次使用<classpath>结构。

 

下面的例子:

<project ... >

<target ... >

<rmic ...>

<classpath>

<pathelement location="lib/"/>

<pathelement path="{java.class.path}/"/>

<pathelement path="{additional.path}"/>

</classpath>

</rmic>

</target>

<target ... >

<javac ...>

<classpath>

<pathelement location="lib/"/>

<pathelement path="{java.class.path}/"/>

<pathelement path="{additional.path}"/>

</classpath>

</javac>

</target>

</project>

可以写成如下形式:

<project ... >

<path id="project.class.path">

<pathelement location="lib/"/>

<pathelement path="{java.class.path}/"/>

<pathelement path="{additional.path}"/>

</path>

<target ... >

<rmic ...>

<classpath refid="project.class.path"/>

</rmic>

</target>

<target ... >

<javac ...>

<classpath refid="project.class.path"/>

</javac>

</target>

</project>

所有使用PatternSets, FileSets 或 path-like structures嵌套元素的task也接受这种类型的引用。

4Ant的Core Tasks

4.1File(Directory)类

4.1.1Mkdir

创建一个目录,如果他的父目录不存在,也会被同时创建。

例子:

<mkdir dir="build/classes"/>

说明:如果build不存在,也会被同时创建

4.1.2Copy

拷贝一个(组)文件、目录

例子:

1.拷贝单个的文件:

<copy file="myfile.txt" tofile="mycopy.txt"/>

2.拷贝单个的文件到指定目录下

<copy file="myfile.txt" todir="../some/other/dir"/>

3.拷贝一个目录到另外一个目录下

<copy todir="../new/dir">

<fileset dir="src_dir"/>

</copy>

4.拷贝一批文件到指定目录下

<copy todir="../dest/dir">

<fileset dir="src_dir">

<include name="**/*.java"/>

<iexclude name="**/Test.java"/>

</fileset>

</copy>

 

<copy todir="../dest/dir">

<fileset dir="src_dir" excludes="**/*.java"/>

</copy>

5.拷贝一批文件到指定目录下,将文件名后增加。Bak后缀

<copy todir="../backup/dir">

<fileset dir="src_dir"/>

<mapper type="glob" from="*" to="*.bak"/>

</copy>

6.拷贝一组文件到指定目录下,替换其中的@标签@内容

<copy todir="../backup/dir">

<fileset dir="src_dir"/>

<filterset>

<filter token="TITLE" value="Foo Bar"/>

</filterset>

</copy>

4.1.3Delete

删除一个(组)文件或者目录

例子

1.删除一个文件

<delete file="/lib/ant.jar"/>

2.删除指定目录及其子目录

<delete dir="lib"/>

3.删除指定的一组文件

<delete>

<fileset dir="." includes="**/*.bak"/>

</delete>

4.删除指定目录及其子目录,包括他自己

<delete includeEmptyDirs="true">

<fileset dir="build"/>

</delete>

4.1.4Move

移动或重命名一个(组)文件、目录

例子:

1.移动或重命名一个文件

<move file="file.orig" tofile="file.moved"/>

2.移动或重命名一个文件到另一个文件夹下面

<move file="file.orig" todir="dir/to/move/to"/>

3.将一个目录移到另外一个目录下

<move todir="new/dir/to/move/to">

<fileset dir="src/dir"/>

</move>

4.将一组文件移动到另外的目录下

<move todir="some/new/dir">

<fileset dir="my/src/dir">

<include name="**/*.jar"/>

<exclude name="**/ant.jar"/>

</fileset>

</move>

5.移动文件过程中增加。Bak后缀

<move todir="my/src/dir">

<fileset dir="my/src/dir">

<exclude name="**/*.bak"/>

</fileset>

<mapper type="glob" from="*" to="*.bak"/>

</move>

 

4.2Java相关

4.2.1Javac

编译java原代码

例子

1.<javac srcdir="{src}"

destdir="{build}"

classpath="xyz.jar"

debug="on"

/>

编译{src}目录及其子目录下的所有。Java文件,。Class文件将放在{build}指定的目录下,classpath表示需要用到的类文件或者目录,debug设置为on表示输出debug信息

2.<javac srcdir="{src}:{src2}"

destdir="{build}"

includes="mypackage/p1/**,mypackage/p2/**"

excludes="mypackage/p1/testpackage/**"

classpath="xyz.jar"

debug="on"

/>

编译{src}和{src2}目录及其子目录下的所有。Java文件,但是package/p1/**,mypackage/p2/**将被编译,而mypackage/p1/testpackage/**将不会被编译。Class文件将放在{build}指定的目录下,classpath表示需要用到的类文件或者目录,debug设置为on表示输出debug信息

3.<property name="classpath" value=".;./xml-apis.jar;../lib/xbean.jar;./easypo.jar"/>

 

<javac srcdir="{src}"

destdir="{src}"

classpath="{classpath}"

debug="on"

/>

路径是在property中定义的

4.2.2java

执行指定的java类

例子:

1.<java classname="test.Main">

<classpath>

<pathelement location="dist/test.jar"/>

<pathelement path="{java.class.path}"/>

</classpath>

</java>

classname中指定要执行的类,classpath设定要使用的环境变量

2.<path id="project.class.path">

<pathelement location="lib/"/>

<pathelement path="{java.class.path}/"/>

<pathelement path="{additional.path}"/>

</path>

 

<target ... >

<rmic ...>

<classpath refid="project.class.path"/>

</rmic>

</target>

 

4.3打包相关

4.3.1jar

将一组文件打包

例子:

1.<jar destfile="{dist}/lib/app.jar" basedir="{build}/classes"/>

{build}/classes下面的所有文件打包到{dist}/lib/app.jar中

2.<jar destfile="{dist}/lib/app.jar"

basedir="{build}/classes"

includes="mypackage/test/**"

excludes="**/Test.class"

/>

{build}/classes下面的所有文件打包到{dist}/lib/app.jar中,但是包括mypackage/test/所有文件不包括所有的Test.class

3.<jar destfile="{dist}/lib/app.jar"

basedir="{build}/classes"

includes="mypackage/test/**"

excludes="**/Test.class"

manifest="my.mf"

/>

manifest属性指定自己的META-INF/MANIFEST.MF文件,而不是由系统生成

4.3.2war

对Jar的扩展,用于打包Web应用

例子:

假设我们的文件目录如下:

thirdparty/libs/jdbc1.jar

thirdparty/libs/jdbc2.jar

build/main/com/myco/myapp/Servlet.class

src/metadata/myapp.xml

src/html/myapp/index.html

src/jsp/myapp/front.jsp

src/graphics/images/gifs/small/logo.gif

src/graphics/images/gifs/large/logo.gif

下面是我们的任务的内容:

<war destfile="myapp.war" webxml="src/metadata/myapp.xml">

<fileset dir="src/html/myapp"/>

<fileset dir="src/jsp/myapp"/>

<lib dir="thirdparty/libs">

<exclude name="jdbc1.jar"/>

</lib>

<classes dir="build/main"/>

<zipfileset dir="src/graphics/images/gifs"

prefix="images"/>

</war>

完成后的结果:

WEB-INF/web.xml

WEB-INF/lib/jdbc2.jar

WEB-INF/classes/com/myco/myapp/Servlet.class

META-INF/MANIFEST.MF

index.html

front.jsp

images/small/logo.gif

images/large/logo.gif

4.3.3ear

用于打包企业应用

例子

<ear destfile="{build.dir}/myapp.ear" appxml="{src.dir}/metadata/application.xml">

<fileset dir="{build.dir}" includes="*.jar,*.war"/>

</ear>

4.4时间戳

在生成环境中使用当前时间和日期,以某种方式标记某个生成任务的输出,以便记录它是何时生成的,这经常是可取的。这可能涉及编辑一个文件,以便插入一个字符串来指定日期和时间,或将这个信息合并到 JAR 或 zip 文件的文件名中。

这种需要是通过简单但是非常有用的 tstamp 任务来解决的。这个任务通常在某次生成过程开始时调用,比如在一个 init 目标中。这个任务不需要属性,许多情况下只需 <tstamp/> 就足够了。

tstamp 不产生任何输出;相反,它根据当前系统时间和日期设置 Ant 属性。下面是 tstamp 设置的一些属性、对每个属性的说明,以及这些属性可被设置到的值的例子:

属性说明例子

DSTAMP 设置为当前日期,默认格式为yyyymmdd 20031217

TSTAMP 设置为当前时间,默认格式为 hhmm 1603

TODAY 设置为当前日期,带完整的月份2003 年 12 月 17 日

例如,在前一小节中,我们按如下方式创建了一个 JAR 文件:

 

<jar destfile="package.jar" basedir="classes"/>

 

在调用 tstamp 任务之后,我们能够根据日期命名该 JAR 文件,如下所示:

 

<jar destfile="package-{DSTAMP}.jar" basedir="classes"/>

 

因此,如果这个任务在 2003 年 12 月 17 日调用,该 JAR 文件将被命名为 package-20031217.jar。

还可以配置 tstamp 任务来设置不同的属性,应用一个当前时间之前或之后的时间偏移,或以不同的方式格式化该字符串。所有这些都是使用一个嵌套的 format 元素来完成的,如下所示:

<tstamp>

<format property="OFFSET_TIME"

pattern="HH:mm:ss"

offset="10" unit="minute"/>

</tstamp>

 

上面的清单将 OFFSET_TIME 属性设置为距离当前时间 10 分钟之后的小时数、分钟数和秒数。

用于定义格式字符串的字符与 java.text.SimpleDateFormat 类所定义的那些格式字符相同

4.5执行SQL语句

通过jdbc执行SQL语句

例子:

1.<sql

driver="org.gjt.mm.mysql.Driver"

url="jdbc:mysql://localhost:3306/mydb"

userid="root"

password="root"

src="data.sql"

/>

2.<sql

driver="org.database.jdbcDriver"

url="jdbc:database-url"

userid="sa"

password="pass"

src="data.sql"

rdbms="oracle"

version="8.1."

>

</sql>

只有在oracle、版本是8.1的时候才执行

4.6发送邮件

使用SMTP服务器发送邮件

例子:

<mail mailhost="smtp.myisp.com" mailport="1025" subject="Test build">

<from address="me@myisp.com"/>

<to address="all@xyz.com"/>

<message>The {buildname} nightly build has completed</message>

<fileset dir="dist">

<includes name="**/*.zip"/>

</fileset>

</mail>

mailhost: SMTP服务器地址

mailport:服务器端口

subject:主题

from:发送人地址

to:接受人地址

message:发送的消息

fileset:设置附件

Ant常用功能

1,想知道这段时间CVS做过哪些改动,CVS修改记录

    <target name="cvschangelog" description="make the change log">

    <cvschangelog dir="{src}" destfile="changelog.xml" start="25 Apr 2004"/>

    <style in="changelog.xml"

               out="changelog.html"

               style="{ant.home}/etc/changelog.xsl">

          <param name="title" expression="Ant ChangeLog"/>

          <param name="module" expression="ant"/>

        </style>

    </target>

这个任务生成25 Apr 2004到现在CVS的修改记录,其中包括了style命令来将XML转化为可读性强的HTML

 

2,单元测试报告

    <target name="test" depends="compile">

        <junit haltonfailure="true" printsummary="true">  

            <classpath refid="test.classpath"/>

            <formatter type="brief" usefile="false"/>

            <formatter type="xml"/>

            <batchtest todir="data">

                <fileset dir="{test.dir}" includes="**/*Test.class"/>

            </batchtest>

        </junit>

       

        <junitreport todir="data">

            <fileset dir="data">

                <include name="TEST-*.xml"/>

            </fileset> 

            <report format="frames" todir="data"/>

        </junitreport>

       

    </target>

   

想看所有的JUNIT结果,就这样吧!持续集成,自动测试。

 

3,生成todolist这里要用到xdoclet包,是扩展的任务。他会把有java代码中todo的标签的内容做成文档,格式类似javadoc。

    <target name="todolist">

    <taskdef name="document" classname="xdoclet.modules.doc.DocumentDocletTask" classpathref="xdoclet.classpath"/>

    <document destdir="todo" >

        <fileset dir="src">   

            <include name="**/*.java" /> 

        </fileset> 

        <info header="To-do list" projectname="Custom Ant Task" tag="todo"/>

    </document>

    </target>

    这只是一种最简单的应用,复杂的还有生成servlet的描述符,EJB描述符,Hibernate配置文件。

   

4,java程序写的不规范,怎么办,使用checkstyle检查一下,这里要去下载checkstyle的包放到路径里。

<target name="checkstyle" description="Check the code's style">

    <taskdef resource="checkstyletask.properties">

        <classpath refid="cms.classpath"/>

    </taskdef>

    <checkstyle config="sun_checks.xml" failOnViolation="false">

        <fileset dir="{src.dir}" includes="**/*.java"/>

        <formatter type="plain"/>

        <formatter type="xml" toFile="checkstyle_errors.xml"/>

    </checkstyle>

</target>

 

<target name="checkreport" description="Check the code's style's report">

    <style in="checkstyle_errors.xml" out="checkstyle_report.html" style="checkstyle-frames.xsl"/>

</target>

 

这样会生成一个报告,包括所有不合规范的代码,检查一下,真是很多。

 

5,好玩的功能,声音和图片。

 

     <target name="init">   

         <sound>     

             <success source="sound/5.wav" loops="1"/>

             <fail source="sound/a.wav" loops="2"/>   

         </sound> 

     </target>  

     

     <target name="fail" depends="init">   

         <fail/>

     </target>   

    

     <target name="success" depends="init"/>   

     这样就会在执行success或fail的时候就会播放上面的声音,就像jbuilder编译完了的声音。

    

     <target name="show_pic" depends="success">   

        <splash imageurl="http://localhost/x.jpg"  showduration="2000"/>

        <sleep seconds="1"/>

        <sleep seconds="1"/>

        <sleep seconds="1"/>   

        <sleep seconds="1"/>   

        <sleep seconds="1"/>   

        <sleep seconds="1"/> 

    </target>

    桌面回探出窗口显示URL里的图片,可惜不知道为什么本地图片路径不可以。

XDoclet基本任务手册

任何人都想过自动生成的代码,自己去写个分析器不是件容易的事,而XDoclet给我们机会建立自己的代码生成器。

 

XDoclet最早用来对付EJB,因为生成EJB的本地和远程接口以及对应的HOME和描述符是一件简单但是枯燥的事,本来我以为,只有JBuilder这样的集成编辑器可以很好的简化工作,后来知道XDoclet也能够完成得不错。

我最早用XDoclet是因为学习hibernate,hibetnate的描述文件并不复杂,关键的部分不多,可是一旦对POJO修改,就必须要劳师动众的找到对应的描述符来修改,增加了一次出错的机会,而使用了XDoclet就可以做到同步的修改。

还有就是struts,首先是配置文件,许多人操作同一个文件会产生冲突,有了XDoclet我们就不怕了,还有validate文件也一样,有了XDoclet就会解决大部分冲突问题。

之所以起这么一个名字,主要因为XDoclet和Ant结合得很紧,尽管实际上做的工作并没有直接的联系,但XDoclet除了Ant接口就只有些Maven接口插件了,所以XDoclet几乎是完全依赖Ant的。

 

 

本篇文章的目录结构如下,因为只是为了说明问题,在我的ant的build文件中并没有包括路径名的引用,一切是直接的方式。

├─classes

├─doc

├─gen

├─lib

│commons-collections-2.1.jar

│commons-logging-1.0.3.jar

│commons-validator.jar

│log4j-1.2.8.jar

│servlet.jar

│struts.jar

│xdoclet-1.2.1.jar

│xdoclet-apache-module-1.2.1.jar

│xdoclet-ejb-module-1.2.1.jar

│xdoclet-hibernate-module-1.2.1.jar

│xdoclet-web-module-1.2.1.jar

│xdoclet-xdoclet-module-1.2.1.jar

│xjavadoc-1.0.3.jar

├─merge

├─src

├─todo

└─web

 

只列出lib中的文件,每一个的作用在后面慢慢描述。

 

build.xml

开头增加

<path id="xdoclet.classpath">

<fileset dir="lib">

<include name="*.jar"/>

</fileset>

<pathelement location="classes"/>

</path>

**************************************************************************************************

 

1,最简单的todolist

 

每一篇讲XDoclet都送这里开始,有很多原因的。XDoclet的灵感来自JavaDoc,JavaDoc把文档写在代码里,缓解了困扰编程领域多年的文档与程序同步问题。这里有个很有趣的事,就是UNIX业界的人们传递下来这样一个传统,就是代码是最好的文档,保持文档的同步实在是费力不讨好的事,所以他们提出这样一个好主意,不过JavaDoc更聪明,文档是程序注释的一部分,而且可以提取出来。

 

来吧,看这个任务。

<target name="todolist" description="todolist">

<taskdef name="documentdoclet" classname="xdoclet.modules.doc.DocumentDocletTask" classpathref="xdoclet.classpath"/>

<documentdoclet destdir="todo" >

<fileset dir="src">

<include name="**/*.java" />

</fileset>

<info header="Todo list" projectname="XDoclet in Action" tag="todo"/>

</documentdoclet>

</target>

 

然后src写这么一个文件

package xdoclet;

 

public class TodoListTest {

/**

* @todo 我有许多工作要做,只是测试,忽略吧

*/

public TodoListTest() {

}

 

/**

* @todo 我还不知道名字,只是测试,忽略吧

*

*/

public String getYourName(){

return null;

}

}

 

注意要按照javadoc的写法。还要注意ant中的子任务系统,其中info就是我们定义的documentdoclet任务的子任务,我们以后会看到很多类似的情况.

然后运行ant todolist

结果就是一个结构类似javadoc,但是只包括todo标签的html文档,呵呵,可以看看项目里有哪些待办的事。

 

 

 

 

 

2,web.xml和taglib

作servlet映射是个讨厌的工作,当你接收别的项目的时候,这个项目的servlet怎么用可能比较麻烦,可能当时web.xml的映射找不到了,这时怎么办呢?

 

看这个文件

package com.xdocletbook.blog.servlet;

 

import java.io.IOException;

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Level;

import org.apache.log4j.Logger;

 

/**

* @web.servlet

* name="HomePage"

* @web.servlet-init-param

* name="LogLevel"

* value="{LOG_LEVEL}"

* @web.servlet-mapping

* url-pattern="/home"

*

* @web.security-role

*role-name="{OwnerRole}"

* @web.security-role-ref

*role-name="blogowner"

*role-link="{OwnerRole}"

*/

 

 

public class HomePageServlet

extends HttpServlet {

private static Logger LOGGER = Logger.getLogger(HomePageServlet.class);

public void init() throws ServletException {

String logLevel = getInitParameter("LogLevel");

if (logLevel != null && logLevel.length() > 0) {

LOGGER.setLevel(Level.toLevel(logLevel));

}

}

 

public void service(HttpServletRequest request, HttpServletResponse response) throws

ServletException, IOException {

LOGGER.debug("Displaying home page");

request.getRequestDispatcher("jsp/home.jsp").forward(request, response);

}

}

然后配置build.xml增加如下任务

 

<target name="generate-web">

<taskdef name="webdoclet" classname="xdoclet.modules.web.WebDocletTask" classpathref="xdoclet.classpath"/>

<!-- Generate servlet and JSP Tag "stuff" -->

<webdoclet destdir="gen" mergeDir="merge">

<fileset dir="src">

<include name="**/*.java" />

</fileset>

<deploymentdescriptor destdir="web" distributable="false" />

</webdoclet>

</target>

 

然后运行ant generate-web

 

结果就是这样一个web.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

 

<web-app >

 

<!--

To use non XDoclet filters, create a filters.xml file that

contains the additional filters (eg Sitemesh) and place it in your

project's merge dir.Don't include filter-mappings in this file,

include them in a file called filter-mappings.xml and put that in

the same directory.

-->

 

<!--

To use non XDoclet filter-mappings, create a filter-mappings.xml file that

contains the additional filter-mappings and place it in your

project's merge dir.

-->

 

<!--

To use non XDoclet listeners, create a listeners.xml file that

contains the additional listeners and place it in your

project's merge dir.

-->

 

<servlet>

<servlet-name>StrutsActionServlet</servlet-name>

<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

</servlet>

 

<servlet>

<servlet-name>HomePage</servlet-name>

<servlet-class>com.xdocletbook.blog.servlet.HomePageServlet</servlet-class>

 

<init-param>

<param-name>LogLevel</param-name>

<param-value>1</param-value>

</init-param>

 

<security-role-ref>

<role-name>blogowner</role-name>

<role-link>aOwner</role-link>

</security-role-ref>

</servlet>

 

<servlet-mapping>

<servlet-name>StrutsActionServlet</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

 

<servlet-mapping>

<servlet-name>HomePage</servlet-name>

<url-pattern>/home</url-pattern>

</servlet-mapping>

 

<!--

To specify mime mappings, create a file named mime-mappings.xml, put it in your project's mergedir.

Organize mime-mappings.xml following this DTD slice:

 

<!ELEMENT mime-mapping (extension, mime-type)>

-->

 

<!--

To specify error pages, create a file named error-pages.xml, put it in your project's mergedir.

Organize error-pages.xml following this DTD slice:

 

<!ELEMENT error-page ((error-code | exception-type), location)>

-->

 

<!--

To add taglibs by xml, create a file called taglibs.xml and place it

in your merge dir.

-->

 

<!--

To set up security settings for your web app, create a file named web-security.xml, put it in your project's mergedir.

Organize web-security.xml following this DTD slice:

 

<!ELEMENT security-constraint (display-name?, web-resource-collection+, auth-constraint?, user-data-constraint?)>

<!ELEMENT web-resource-collection (web-resource-name, description?, url-pattern*, http-method*)>

<!ELEMENT web-resource-name (#PCDATA)>

<!ELEMENT url-pattern (#PCDATA)>

<!ELEMENT http-method (#PCDATA)>

<!ELEMENT user-data-constraint (description?, transport-guarantee)>

<!ELEMENT transport-guarantee (#PCDATA)>

 

<!ELEMENT login-config (auth-method?, realm-name?, form-login-config?)>

<!ELEMENT auth-method (#PCDATA)>

<!ELEMENT realm-name (#PCDATA)>

<!ELEMENT form-login-config (form-login-page, form-error-page)>

<!ELEMENT form-login-page (#PCDATA)>

<!ELEMENT form-error-page (#PCDATA)>

-->

 

<security-role>

<role-name>aOwner</role-name>

</security-role>

 

</web-app>

 

 

仔细看这个文件,你一定诧异struts的配置信息怎样得来,这是XDoclet的另一种方式,对于第三方的Servlet,我们没有办法再处理原代码,所以我们有了merge选项,看<webdoclet destdir="gen" mergeDir="merge">这一句就知道了,在merge目录里我们有两个文件:

servlets.xml

 

<servlet>

<servlet-name>StrutsActionServlet</servlet-name>

<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

</servlet>

servlet-mappings.xml

 

<servlet-mapping>

<servlet-name>StrutsActionServlet</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

还要注意的是{LOG_LEVEL},这个是说要引用ant 中的变量,所以我的build.xml前面中增加了这两项

<property name="LOG_LEVEL" value="1"/>

<property name="OwnerRole" value="aOwner"/>

 

所以,我们就可以动态的改变部署的Log级别

3,struts自动配置

 

Struts中有两样比较重要的类,Action和Form。

对于Action,我们需要配置Action的映射和Forward属性,对于Form我们也需要注册名字和校验参数,以下就是我们能用XDoclet做到的。

对于Action我们写这样一个Java文件

 

package com.xdocletbook.blog.servlet;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionForward;

import org.apache.struts.action.ActionMapping;

 

/**

* Simple class to test Jakarta Struts generation (Jakarta Struts 1.2 beta 2 only).

*

* @struts.action

*path="/struts/foo"

*name="userForm"

*input="jsp/createBlog.jsp"

*

* @struts.action-forward

*name="success"

*path="/struts/getAll.do"

*redirect="false"

*

*

* @struts.action-exception

* type="com.xdocletbook.blog.exception.ApplicationException"

* key="app.exception"

* path="jsp/error.jsp"

*

* @struts.action-form name="blog.Create"

*/

public final class StrutsAction extends Action

{

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response)

{

return mapping.findForward("success");

}

}

 

关键部分就是注释部分。

 

看我们增加build.xml一个任务,

<target name="generate-web">

<taskdef name="webdoclet" classname="xdoclet.modules.web.WebDocletTask" classpathref="xdoclet.classpath"/>

<!-- Generate servlet and JSP Tag "stuff" -->

<webdoclet destdir="gen" mergeDir="merge">

<fileset dir="src">

<include name="**/*.java" />

</fileset>

<strutsconfigxml version="1.1"/>

</webdoclet>

</target>

 

运行ant generate-web,我们就在gen得到了struts-config.xml

其中关键内容如下

<action

path="/struts/foo"

type="com.xdocletbook.blog.servlet.StrutsAction"

name="userForm"

 

scope="request"

input="jsp/createBlog.jsp"

unknown="false"

validate="true"

>

<exception

 

key="app.exception"

type="com.xdocletbook.blog.exception.ApplicationException"

path="jsp/error.jsp"

/>

 

 

<forward

name="success"

path="/struts/getAll.do"

redirect="false"

/>

</action>

 

如果我们有许多Action,就可以随时生成这样一个文件,不必在意有人改过这个文件。同时你也不必担心不小心忘了改这个文件,因为你改了

 

Java时,许多默认的属性也跟这改了。

看到这里,许多用过workshop的一定感觉到页面流不就是这样吗?当通过图形界面定义流程时,看看页面流的源码你就会发现,注释中有一些

 

特殊的标记,这说明workshop的注释有着xdoclet一样的功能,只不过workshop提供了很好的界面,而不需要自己写注释,而且workshop提供了

 

更好的语法检查,呵呵,只是将许多action写到一起,是有些乱。

 

Struts的另一个主要的部分就是Form了,虽然我一开始觉得Form有些麻烦,对付动态的Form有些无能为力,但是结合一些相关的插件后,效果确实不错。

 

 

这是我们的Form文件,我们还使用ValidatorForm来做自动验证。

 

package com.xdocletbook.blog.servlet;

 

import java.io.Serializable;

import org.apache.struts.validator.ValidatorForm;

 

/**

*

* @struts.form

*name="blog.Create"

*/

public class BlogCreateForm

extends ValidatorForm

implements Serializable {

private String name;

private String owner;

private String email;

public BlogCreateForm() {}

 

public String getName() {

return this.name;

}

/**

* @struts.validator

* type="required"

*/

 

public void setName(String name) {

this.name = name;

}

 

 

public String getOwner() {

return this.owner;

}

/**

* @struts.validator

* type="required"

*/

 

public void setOwner(String owner) {

this.owner = owner;

}

 

public String getEmail() {

return this.email;

}

/**

*@struts.validator

*type="required"

*@struts.validator

*type="email"

*/

 

public void setEmail(String email) {

this.email = email;

}

}

 

 

然后运行ant generate-web

 

这样struts-config.xml就有了

<form-beans>

<form-bean

name="blog.Create"

type="com.xdocletbook.blog.servlet.BlogCreateForm"

/>

 

<!

 

--

If you have non XDoclet forms, define them in a file called struts-forms.xml and

place it in your merge

 

directory.

-->

</form-beans>

 

这里有一个陷阱,就是Struts XDoclet处理form-beans时,只处理类型是Form的,对于类型是ValidatorForm的Form如果你不把对应的类文件放

 

到classpath下,XDoclet就会忽略它,所以struts的包一定要放到类路径下,让XDoclet有机会知道ValidatorForm是Form的子类。

 

还有每一个setXXX方法,有一些表示限制的注释,这些帮助我们生成了

 

validation.xml

 

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons

 

Validator Rules Configuration 1.0//EN" "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">

 

<form-validation>

<!--

 

 

Define global validation config in validation-global.xml

-->

<formset>

<form name="blog.Create">

<field property="name" depends="required">

<arg0 key="blog.Create.name"/>

</field>

<field property="owner" depends="required">

<arg0 key="blog.Create.owner"/>

</field>

<field property="email" depends="required,email">

<arg0 key="blog.Create.email"/>

</field>

</form>

 

</formset>

</form-validation>

Ant+checkstyle 实现代码检查

1 checkstyle简介

checkstyle是一个帮助开发者按照某种习惯编写java代码的工具,他实现了代码检查的自动化,帮助人们从这种繁琐的工作中解放出来。

默认提供了对sun编程规范的支持,但是checkstyle是一个具有高可配置性的,你完全可以根据自己的要求来配置需要检查的内容。

2 工具下载、安装

2.1 Ant下载

最新版本1.6.1,下载地址:http://ant.apache.org/

解压缩到c:/ant1.6.1,后面将引用为%ant_home%

2.2 cheskstyle下载

最新版本3.3,下载地址:http://checkstyle.sourceforge.net/

解压缩到c:/checkstyle3.3,后面将引用为%checkstyle_home%

 

3 简单配置

3.1 环境变量:

set path=%ant_home%/bin

set classpath=%checkstyle_home%/checkstyle-all-3.3.jar

3.2 build.xml文件

  • 增加taskdef

<taskdef resource="checkstyletask.properties"

           classpath="%checkstyle_home%\checkstyle-all-3.3.jar"/>

  • 增加task

<target name="checkstyle">

<target name="checkstyle">

<checkstyle config="sun_checks.xml" classpath="%checkstyle_home%\checkstyle-all-3.3.jar">

<fileset dir="build/classes" includes="**/*.java"/>

</checkstyle>

</target>

属性说明:

config  要使用的格式配置文件

classpath 要用到的jar文件

fileset    需要检查的文件集合

4 说明

需要检查的内容是基于module配置的,所以如果你不要检查那些module,你可以将他去掉,下面是默认的sun代码规范检查的配置文件:

<?xml version="1.0"?>

<!DOCTYPE module PUBLIC

    "-//Puppy Crawl//DTD Check Configuration 1.1//EN"

    "http://www.puppycrawl.com/dtds/configuration_1_1.dtd">

 

<!--

 

  Checkstyle configuration that checks the sun coding conventions from:

 

    - the Java Language Specification at

      http://java.sun.com/docs/books/jls/second_edition/html/index.html

 

    - the Sun Code Conventions at http://java.sun.com/docs/codeconv/

 

    - the Javadoc guidelines at

      http://java.sun.com/j2se/javadoc/writingdoccomments/index.html

 

    - the JDK Api documentation http://java.sun.com/j2se/docs/api/index.html

 

    - some best practices

 

  Checkstyle is very configurable. Be sure to read the documentation at

  http://checkstyle.sf.net (or in your downloaded distribution).

 

  Most Checks are configurable, be sure to consult the documentation.

 

  To completely disable a check, just comment it out or delete it from the file.

 

  Finally, it is worth reading the documentation.

 

-->

 

<module name="Checker">

 

    <!-- Checks that a package.html file exists for each package.     -->

    <!-- See http://checkstyle.sf.net/config_javadoc.html#PackageHtml -->

    <module name="PackageHtml"/>

 

    <!-- Checks whether files end with a new line.                        -->

    <!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile -->

    <module name="NewlineAtEndOfFile"/>

 

    <!-- Checks that property files contain the same keys.         -->

    <!-- See http://checkstyle.sf.net/config_misc.html#Translation -->

    <module name="Translation"/>

 

 

    <module name="TreeWalker">

 

        <!-- Checks for Javadoc comments.                     -->

        <!-- See http://checkstyle.sf.net/config_javadoc.html -->

        <module name="JavadocMethod"/>

        <module name="JavadocType"/>

        <module name="JavadocVariable"/>

        <module name="JavadocStyle"/>

 

 

        <!-- Checks for Naming Conventions.                  -->

        <!-- See http://checkstyle.sf.net/config_naming.html -->

        <module name="ConstantName"/>

        <module name="LocalFinalVariableName"/>

        <module name="LocalVariableName"/>

        <module name="MemberName"/>

        <module name="MethodName"/>

        <module name="PackageName"/>

        <module name="ParameterName"/>

        <module name="StaticVariableName"/>

        <module name="TypeName"/>

 

 

        <!-- Checks for Headers                                -->

        <!-- See http://checkstyle.sf.net/config_header.html   -->

        <!-- <module name="Header">                            -->

            <!-- The follow property value demonstrates the ability     -->

            <!-- to have access to ANT properties. In this case it uses -->

            <!-- the {basedir} property to allow Checkstyle to be run  -->

            <!-- from any directory within a project. See property      -->

            <!-- expansion,                                             -->

            <!-- http://checkstyle.sf.net/config.html#properties        -->

            <!-- <property                                              -->

            <!--     name="headerFile"                                  -->

            <!--     value="{basedir}/java.header"/>                   -->

        <!-- </module> -->

 

        <!-- Following interprets the header file as regular expressions. -->

        <!-- <module name="RegexpHeader"/>                                -->

 

 

        <!-- Checks for imports                              -->

        <!-- See http://checkstyle.sf.net/config_import.html -->

        <module name="AvoidStarImport"/>

        <module name="IllegalImport"/> <!-- defaults to sun.* packages -->

        <module name="RedundantImport"/>

        <module name="UnusedImports"/>

 

 

        <!-- Checks for Size Violations.                    -->

        <!-- See http://checkstyle.sf.net/config_sizes.html -->

        <module name="FileLength"/>

        <module name="LineLength"/>

        <module name="MethodLength"/>

        <module name="ParameterNumber"/>

 

 

        <!-- Checks for whitespace                               -->

        <!-- See http://checkstyle.sf.net/config_whitespace.html -->

        <module name="EmptyForIteratorPad"/>

        <module name="NoWhitespaceAfter"/>

        <module name="NoWhitespaceBefore"/>

        <module name="OperatorWrap"/>

        <module name="ParenPad"/>

        <module name="TypecastParenPad"/>

        <module name="TabCharacter"/>

        <module name="WhitespaceAfter"/>

        <module name="WhitespaceAround"/>

 

 

        <!-- Modifier Checks                                    -->

        <!-- See http://checkstyle.sf.net/config_modifiers.html -->

        <module name="ModifierOrder"/>

        <module name="RedundantModifier"/>

 

 

        <!-- Checks for blocks. You know, those {}'s         -->

        <!-- See http://checkstyle.sf.net/config_blocks.html -->

        <module name="AvoidNestedBlocks"/>

        <module name="EmptyBlock"/>

        <module name="LeftCurly"/>

        <module name="NeedBraces"/>

        <module name="RightCurly"/>

 

 

        <!-- Checks for common coding problems               -->

        <!-- See http://checkstyle.sf.net/config_coding.html -->

        <module name="AvoidInlineConditionals"/>

        <module name="DoubleCheckedLocking"/>    <!-- MY FAVOURITE -->

        <module name="EmptyStatement"/>

        <module name="EqualsHashCode"/>

        <module name="HiddenField"/>

        <module name="IllegalInstantiation"/>

        <module name="InnerAssignment"/>

        <module name="MagicNumber"/>

        <module name="MissingSwitchDefault"/>

        <module name="RedundantThrows"/>

        <module name="SimplifyBooleanExpression"/>

        <module name="SimplifyBooleanReturn"/>

 

        <!-- Checks for class design                         -->

        <!-- See http://checkstyle.sf.net/config_design.html -->

        <module name="DesignForExtension"/>

        <module name="FinalClass"/>

        <module name="HideUtilityClassConstructor"/>

        <module name="InterfaceIsType"/>

        <module name="VisibilityModifier"/>

 

 

        <!-- Miscellaneous other checks.                   -->

        <!-- See http://checkstyle.sf.net/config_misc.html -->

        <module name="ArrayTypeStyle"/>

        <module name="FinalParameters"/>

        <module name="GenericIllegalRegexp">

            <property name="format" value="\s+"/>

            <property name="message" value="Line has trailing spaces."/>

        </module>

        <module name="TodoComment"/>

        <module name="UpperEll"/>

    </module>

 

</module>

5 如何自己配置

可以看到,xml里面的内容都是类似<module name="PackageHtml"/>这样的,这表示检查这部分的规范,置于具体的规范内容,每个module的前面都有连接地址,大家可以去看。

以<module name="PackageHtml"/>为例:

他的要求是说,每个包下面都要有个package.html文件,如果你不想检查这一项,你可以将这个元素从xml内容中删除。

Jbuilder 用Jbuilder制作。Exe启动java程序

Java程序是运行在JVM上面的,我们用Java所做的程序要不就用到page里面去,要不就做成Jar,但运行的前提条件是你的IE里面装了JVM.

 

倘若说看到标题后,以为jb真的提供了一种把java应用程序打包成exe文件的主流方法的话,你会失望的,下面的一个小技巧只是一个技巧而已。

 

这个是borland不公开的使用技巧,能够通过jbuilder来制作exe文件来启动java文件。jbuilder并不支持本地编译机制。但是有一个隐藏的技巧可以让你从可执行文件来启动java程序,可以出现或者不出现console窗口。想做到这些,需要jbuilder的bin目录下的这些文件:

jbuilder.exe

jbuilderw.exe (可选)

jbuilder.config

jdk.config

javalauncher.dll

 

“jbuilder.exe”是一个通用的可执行外壳文件,用以启动java程序,”jbuilderw.exe“好像是javaw.exe一样,它把”jbuilder.exe”包装起来,但是运行时候不显示那个console的窗口。使用这些文件的关键是文件名。“jbuilder.exe”查找一个文件叫”jbuilder.config”的配置文件,里面包含了运行java程序的必须信息。同样的”jbuilderw.exe”查找”jbuilder.exe”来启动不带console窗口的java程序。如果把jbuilder.exe重命名为”foo.exe”,那”foo.exe”将去寻找”foo.config”配置文件,同样”jbuilderw.exe”被重命名为”foow.exe”,它会去寻找”foo.exe”文件。

说到这里,聪明的读者应该猜到怎样利用jbuilder.exe来启动应用程序了。只要把jbuilder

.exe,jbuilerw.exe,jbuilder.config改名成相应的文件名,在jbuilder.config里面指定主

类和类路径,就能够通过执行jbuilder.exe(或者被改名后的exe文件)来启动java应用程序

。下面是用本机为例。

borland jbuilder 5被安装在e:\jbuilder5\目录下,在e:\jbuilder5\bin\下建立一个temp目录,然后把jbuilder.exe,jbuilder.config,javalauncher.dll,jdk.config四个文件拷贝到e:\jbuilder5\bin\temp\目录下,然后在这个目录下建立一个hello目录,在这个目录下

成一个hello.java文件,即e:\jbuilder5\bin\temp\hello\hello.java文件,

file://hello.java/

package hello;

public class hello{

public static void main(string s[]){

system.out.println("hello, exe file!");

}

}

 

编译成class文件,编译所有java文件

然后打开jbuilder.config文件,作相应的修改:

在jbuilder.config里面找到下面两行

# start jbuilder using the its main class

mainclass com.borland.jbuilder.jbuilder

 

修改为

# start jbuilder using the its main class

mainclass hello.hello

 

addpath e:/jbuilder5/bin/temp/

 

addpath命令是把目录加入类路径中,这个命令和其它config里面可以识别的命令可以在jbu

ilder/bin目录下的config_readme.txt里面找到详细说明。

然后将jdk.config里面的javapath修改成相对的路径,例如原来是

javapath ../jdk1.3/bin/java

修改成

javapath ../../jdk1.3/bin/java

 

最后

将jbuilder.exe,jbuilder.config修改成所需要的文件名,例如foo.exe和foo.config文件。

 

现在执行foo.exe文件

 

 

 

至此,通过修改jbuilder来使用exe文件启动自己的java应用程序已经完成了。

 

但是好玩的地方并不在这个地方,下面的小技巧可能更有趣,将jar文件打包进入exe文件!

 

假设利用上面的文件,生成hello.jar包,执行过程和运行结果如图18-16:

jar cvf hello.jar hello\*.class

 

 

 

 

然后将jar包附加到jbuilder.exe后面去,

copy /b ..\jbuilder.exe+hello.jar foo.exe

 

 

在foo.config(jbuilder.config)文件里面把前面加入的类路径去掉,并加入下面的路径:

addpath e:/jbuilder5/bin/temp/foo.exe

然后执行,

 

 

看到了么?一个含jar包的exe文件被执行了!

这个过程的大致原理是:exe文件的重要信息都在文件头部,所以把乱七八糟的东西放exe文件尾部是不要紧的;而jar/zip文件的重要信息是在文件尾部的,这样它们两不相干,能够容易的被执行。

 

请注意:读者如果使用这个功能,得自己承担可能带来的风险,因为borland对这个功能不提供官方的支持!

Jbuilder 的常用快捷键

在开发工具中使用快捷键可以节省时间,提高效率。下面是Jbuilder 的常用快捷键

 

F1 Help

 

ctrl + F2 结束程序

 

F3 查找下一个

 

shift + F3 反向查找下一个

 

ctrl + F 查找

 

ctrl + p 路径查找

 

ctrl + F4 运行到当前位置

 

F5 设置断点

 

F7 跟入

 

F8 单步

 

F9 运行

 

ctrl + F9 编译工程

 

shift + F9 调试模式运行

 

ctrl + shift + F9 编译当前类

 

ctrl + H 显示本类成员

 

ctrl + J 显示模板

 

ctrl + shift + c 自动完成错误捕捉代码

 

ctrl + Enter /mouseClick 当前关键字追踪

 

ctrl + shit + 数字(0-9) 设置/去除标签

 

ctrl + 数字(0-9) 返回标签位置

 

ctrl + alt + -> / <- 返回最近访问点

 

ctrl + -> / <- 光标跳过当前单位词

 

ctrl + shift + -> / <- 选择单位词

 

ctrl + 上下方向键滚动屏幕

 

ctrl + home/end/pageup/pagedown

 

shift +盘方向键/home/end/pageup/pagedown 选择

 

ctrl + e 增量式查找

 

ctrl + w 捕捉离光标最近的单词

 

ctrl + shift + h 参数查找

 

ctrl + alt + space class insight

 

ctrl + F4 关闭当前类

 

ctrl + shift + F4 关闭(显示选择)

 

ctrl + B 切换窗体

 

ctrl + F6 切换窗体

 

ctrl + alt + p/c/m/z/s 视图开关

 

ctrl + g 到指定行

 

Tab 格式化宿进

 

ctrl + / 注释/去除注释选择行

ctrl + shift + I 宿进

ctrl + shift + U 反向宿进

JbuilderX下配置Hibernate

1.安装JBuilderX和Oracle9i,并使用以下信息配置Oracle 

用户名:system 

密码:admin 

服务:cpdb 

 

2.先去http://prodownloads.sourceforge.net/hibernate/下载HibernateAPI的包hibernate-2.1.6.zip 

 

3.在JBuilder中选择Project菜单中的Project  Properties,在Require  Library中加入Hibernate所有的API包,还要加入Oracle目录ORANT\jdbc\lib\classes12.zip 

 

4.然后将截压缩后的hibernate-2.1\etc\hibernate.properties拷贝到本地project的classes目录下然后做以下变化: 

①注释默认的数据库连接,将 

##  HypersonicSQL 

hibernate.dialect  net.sf.hibernate.dialect.HSQLDialect 

hibernate.connection.driver_class  org.hsqldb.jdbcDriver 

hibernate.connection.username  sa 

hibernate.connection.password 

hibernate.connection.url  jdbc:hsqldb:hsql://localhost 

hibernate.connection.url  jdbc:hsqldb:test 

hibernate.connection.url  jdbc:hsqldb:. 

 

改为 

##  HypersonicSQL 

#hibernate.dialect  net.sf.hibernate.dialect.HSQLDialect 

#hibernate.connection.driver_class  org.hsqldb.jdbcDriver 

#hibernate.connection.username  sa 

#hibernate.connection.password 

#hibernate.connection.url  jdbc:hsqldb:hsql://localhost 

#hibernate.connection.url  jdbc:hsqldb:test 

#hibernate.connection.url  jdbc:hsqldb:. 

 

然后修改Oracle的连接,将 

##  Oracle 

#hibernate.dialect  net.sf.hibernate.dialect.Oracle9Dialect 

#hibernate.dialect  net.sf.hibernate.dialect.OracleDialect 

#hibernate.connection.driver_class  oracle.jdbc.driver.OracleDriver 

#hibernate.connection.username  ora 

#hibernate.connection.password  ora 

#hibernate.connection.url  jdbc:oracle:thin:@localhost:1521:test 

 

改为 

##  Oracle 

hibernate.dialect  net.sf.hibernate.dialect.Oracle9Dialect 

hibernate.dialect  net.sf.hibernate.dialect.OracleDialect 

hibernate.connection.driver_class  oracle.jdbc.driver.OracleDriver 

hibernate.connection.username  system 

hibernate.connection.password  admin 

hibernate.connection.url  jdbc:oracle:thin:@172.28.122.49:1521:cpdb 

 

注意:@172.28.122.49为Oracle服务器的ip地址,1521为端口号 

 

5.在project下建立package  person,在package下建立四个class,分别为: 

①PersonModel.java 

 

package  person; 

import  java.io.Serializable; 

public  class  PersonModel  implements  Serializable  { 

   private  Long  id; 

   private  String  name; 

   private  String  address; 

   public  Long  getId()  { 

       return  id; 

   } 

   public  void  setId(Long  id)  { 

       this.id  =  id; 

   } 

   public  void  setName(String  name)  { 

       this.name  =  name; 

   } 

   public  String  getName()  { 

       return  name; 

   } 

   public  void  setAddress(String  address)  { 

       this.address  =  address; 

   } 

   public  String  getAddress()  { 

       return  address; 

   } 

 

②TestPersonModel1.java 

package  person; 

import  net.sf.hibernate.SessionFactory; 

import  net.sf.hibernate.cfg.Configuration; 

import  net.sf.hibernate.tool.hbm2ddl.SchemaExport; 

public  class  TestPersonModel1  { 

   private  static  SessionFactory  sessionFactory; 

   public  static  void  main(String[]  args)  throws  Exception{ 

       System.out.println("start"); 

       Configuration  conf=  new  Configuration().addClass(PersonModel.class); 

       SchemaExport  dbExport=new  SchemaExport(conf); 

       dbExport.setOutputFile("sql_out_lib\\sql.txt"); 

       dbExport.create(true,  true); 

   } 

 

③TestPersonModel2.java 

package  person; 

import  net.sf.hibernate.Session; 

import  net.sf.hibernate.Transaction; 

import  net.sf.hibernate.SessionFactory; 

import  net.sf.hibernate.cfg.Configuration; 

public  class  TestPersonModel2  { 

   private  static  SessionFactory  sessionFactory; 

   public  static  void  main(String[]  args)  throws  Exception{ 

       Configuration  conf=  new  Configuration().addClass(PersonModel.class); 

       //在表中插入第一条数据 

       sessionFactory  =  conf.buildSessionFactory(); 

       Session  s  =  sessionFactory.openSession(); 

       Transaction  t  =    s.beginTransaction(); 

       PersonModel  p1=new  PersonModel(); 

       p1.setName("zhaol"); 

       p1.setAddress("shanghai"); 

       //持久化 

       s.save(p1); 

       //数据库中已有记录 

       t.commit(); 

       s.close(); 

   } 

④TestPersonModel3.java 

package  person; 

import  net.sf.hibernate.Session; 

import  net.sf.hibernate.SessionFactory; 

import  net.sf.hibernate.cfg.Configuration; 

import  net.sf.hibernate.Query; 

public  class  TestPersonModel3  { 

   private  static  SessionFactory  sessionFactory; 

   public  static  void  main(String[]  args)  throws  Exception{ 

       Configuration  conf=  new  Configuration().addClass(PersonModel.class); 

       sessionFactory  =  conf.buildSessionFactory(); 

       Session  s  =  sessionFactory.openSession(); 

       PersonModel  p  =  new  PersonModel(); 

       Query  q  =  s.createQuery("from  PersonModel  as  p  where  p.id=1"); 

       p  =  (PersonModel)  q.list().get(0); 

       System.out.println(p.getName()); 

       s.close(); 

   } 

其中PersonModel.java是对应数据库中字段的存储结构,TestPersonModel1.java是测试自动创建表和字段,TestPersonModel2.java是测试在表中插入记录,TestPersonModel3.java是测试从表中取得记录. 

 

6.编译所有的java文件 

 

7.好了,到最后一步了,也是最关键的一步,我们已经定义了数据库连接(hibernate.properties) 

创建了字段的存储结构(PersonModel.java),也写好了操作数据库的代码(TestPersonModel1.java~TestPersonModel3.java),接下来要做的是定义数据库中表的配置文件,因为我们的字段的存储结构文件是PersonModel.java,所以创建PersonModel.hbm.xml(注意:表的配置文件名是由[字段的存储结构文件名+.hbm.xml]构成,创建位置为project的class\person目录下(注意:数据库定义文件hibernate.properties是放在class目录下的,而表的配置文件要放在相对应的包下,我们这里的包名是person,所以就放在class\person下) 

 

PersonModel.hbm.xml的内容如下: 

<?xml  version="1.0"  encoding="GB2312"?> 

<!DOCTYPE  hibernate-mapping  SYSTEM  "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"  > 

<hibernate-mapping> 

<class  name="person.PersonModel" 

                 table="zl"> 

       <id  name="id"  type="long"> 

           <generator  class="sequence"> 

               <param  name="sequence">ZL_ID_SEQ</param> 

           </generator> 

       </id> 

       <property  name="name"/> 

       <property  name="address"/> 

        

   </class> 

</hibernate-mapping> 

表名为zl,里面有两个字段(name和address,对应person.PersonModel),id是一个sequence. 

 

9.好了,配置完成,接下来运行一下吧,先运行TestPersonModel1.class,让hibernate为我们自动建立一张名为zl(内有字段name和address)的表 

 

怎么样?表是不是已经建好了,呵呵. 

接下来运行TestPersonModel2.class,让hibernate再为我们插入一条记录 

Weblogic8.1+JBuilder的配置入门
  • Weblogic 8.1的安装与配置

 

1. 点击安装文件开始安装,首先"Next"à选中"Yes",点击"Next"à创建目录,这里使用默认的,直接"Next"à一路"Next",直到开始安装。

 

2. Step by step, 安装完毕后,我们要配置自己的domain,

点击"开始/程序/BEA WebLogic Platform8.1/ Configuration Wizard",

选择"Create a new Weblogic configuration",

"NextàBasic Weblogic Server DomainàNextàExpressàNext" 输入

"Name*,Password*,Description"

接着Nextà右下角修改"Configuration Name: à Create" 一直到进度条为100%时 Done完成。

 

3. 现在我们可以启动mydomain,看是否能正常使用了。

  点击"开始/程序/BEA WebLogic Platform 8.1/User Projects/mydomain/Start Server"

会弹出如DOS弹出窗口,并一直保持,没有异常报错,那就要恭喜你了,你的Weblogic已经正常启动了,Weblogic的基本安装和配置就算完成了。

 

  • Jbuilder2005的配置

 

Jbuilder2005安装好,能正常运行了,接下来就可以在Jbuilder中配置Weblogic了,点击"开始/程序/Borland JBuilder 2005 Enterprise /Borland JBuilder 2005 Enterprise"

启动Jbuilder 2005à在菜单栏点击"Tools/Configure Servers..."à弹出"Configure Servers"窗口,

在左边的User Home目录中选择"WebLogic Platform Server 8.x",选中右边的"Enable server"项,这时右边所有本来是灰色的项都变得黑色的可使用状态。

首先,在"General"子页中将Home directory:设为d:/bea/weblogic81/server(注:这里的d:/bea填的应该是你自己的bea安装目录),

"Working directory:"设为d:/bea/user_projects/mydomain, 如果你的bea不是安装在c:/,

那么就需要将"VM parameters:"属性中的"-Djava.library.path="D:D:/bea/weblogic700/server/bin""

和" -Djava.security.policy=="D:D:/bea/weblogic700/server/lib/weblogic.policy" " 去掉一个"D:"。

  接下来到"Custom"子页,"BEA home directory:"设为d:/ bea ;"

JDK installation directory:"设为d:/bea/jdk141_02 ,

"Domain directory:"设为d:/bea/user_projects/mydomain,

在"User name:","Possowrd:"中填入安装WebLogic时的用户名和密码,

将"Listen address:"改为"localhost",

不选"Add an Admin Console item to the tools menu"和"Add a Configuration Wizard item to the tools menu",完成后点击"OK"。

接下来在菜单栏点击"Project/Default Project Properties..."à弹出"Default Project Properties"窗口,

在"Server" 子页中选中"Single server for all services in project",

然后在其下面的下拉框中选择"Weblogic Application Server 8.x",点击"OK"确定。

JBuilderX+JBoss的配置

JBuilderX是一个可视化 JAVA 开发工具。它是在 Java 2 平台上开发商业应用程序、数据库、发布程序的优秀工具。它支持 J2EE,所以程序员可以快速的转换企业版 Java 应用程序。本文以Jbuilder 9为例来说明JBuilderX+JBoss的配置:Jbuilder 9直接安装在了C:\Jbuilder9目录中。JBoss下载地址:http://umn.dl.sourceforge.net/sourceforge/jboss/jboss-3.0.8_tomcat-4.1.24.zip下载后,直接解压到硬盘,我选择的安装文件夹是C:\Jbuilder9\jboss-3.0.8_tomcat-4.1.24.Jbuilder没有提供对Jboss的直接支持,我们必须从第三方获得插件。http://sourceforge.net/project/showfiles.php?group_id=46485&package_id=69308&release_id=153477

下载后,将JbossOpenTool.jar解压出来,拷贝到C:\Jbuilder9\ lib\ext下。

启动JBuilder,选择Tools->Configure Servers,我们可以从窗口左侧的列表中看到:Jboss 2.4x和Jboss 3.x.,选中后者,然后将窗口右上角的’Enable server’这个选项选中。

选择General页面,先填写Home directory,这个就直接填入C:/Jbuilder9/jboss-3.0.8_tomcat-4.1.24,接下来选择 Working directory ,相应填入C: /Jbuilder9/jboss-3.0.8_tomcat-4.1.24/bin,在下面的Class页中,按‘ADD’按钮,选择C: /Jbuilder9/jboss-3.0.8_tomcat-4.1.24v/bin/run.jar.

 

翻到Custom页面中,在JBoss Installation Directory 中填写与Home directory相同的路径即可。Tomcat 4X  JBuilder Installation Directory中填写C: /Jbuilder9/jboss-3.0.8_tomcat-4.1.24/tomcat-4.1.x

最后一项 JBoss Configuration to Use中,请选择 default。照例,应该按窗口最下面的‘OK’了,但按下去后,系统出现错误提示.这时开始查找该文件,在C: \Jbuilder9\jboss-3.0.8_tomcat-4.1.24\tomcat-4.1.x\common\lib下面找到了jasper-compiler.jar,再将其拷贝到C: \Jbuilder9\jboss-3.0.8_tomcat-4.1.24\tomcat-4.1.x\lib目录中,再次点击‘OK’按钮时,没有再出现错误提示,这一步暂切配置成功。

接下来这个配置就很简单,选择Tools—>Configure Libraries,,再窗口左下角选择‘NEW’,在Name框中填写’Jboss Libs’,Loacation:选择‘User Home’,点击’ADD‘按钮,增加

C: /Jbuilder9/jboss-3.0.8_tomcat-4.1.24/server/default/lib/jboss-j2ee.jar和

C: /Jbuilder9/jboss-3.0.8_tomcat-4.1.24/tomcat-4.1.x/common/lib/servlet.jar。如图4:这样,Jboss终于在Jbuilder9中配置完毕。

JBuilderX与Tomcat5.0

JbuilderX与Tomcat5.0不跟现成的tomcat4.1一样,需要另外配置。

1、运行Jbuilderx,进入server configure. tools-->configure server-->tomcat4.1.

2、复制tomcat4.1,并将其名称改为tomcat 5.0,ok后确定。

3、解压刚才下载的tomcat5.0到jbuilderx的安装目录下的thirthparty下,或者拷贝已解压的过去。

4、在jbuilderx里面server configure中(操作位置如4),将tomcat5.1的路径指向刚才tomcat5.0的路径。

5、配置tomcat5.0 servlet的liberty的包,默认拷贝的tomcat4.1的servlet包和5.0得不一样,改为jsp-api.jar和servlet-api.jar2个文件。操作方法:tools-->configure libraries-->user home-->tomcat 5.0 servlet.右边改为add tomcat5.0路径下的commonslibjsp-api.jar和servlet-api.jar等文件。

6、在工程中增加tomcat 5.0 servlet这个类库,默认好像没有自动增加,4.0是可以自动增加的。

7、运行配置tomca4.1的工程,运行期间,拷贝work dir下的conf/server.xml,去掉generate的标记。如下:

This comment marks this file as generated, so it may be deleted and regenerated at any time. To preserve manual changes to this file, delete this comment.

,修改:

Connector acceptCount="10" className="org.apache.coyote.tomcat4.CoyoteConnector" connectionTimeout="60000" debug="0" maxProcessors="75" minProcessors="5" port="8080"

为:

Connector acceptCount="10" className="org.apache.coyote.tomcat5.CoyoteConnector" connectionTimeout="60000" debug="0" maxProcessors="75" minProcessors="5" port="8080" .

8、将工程的server设置为tomcat5.0,运行工程,tomcat5.0可以正常运行了。

如何将一个远程的WL服务器作为JB的默认服务器

错误描述:如何将一个远程的WL服务器作为JB的默认服务器

原因和解决方法:将远程服务器的目录映射为本地目录

jbuilder(struts)+weblogic时的NullPointerException问题

错误描述:我有个程序,采用文件夹部署的方式部署在weblogic上的。修改完action后make这个action或者全编译时(全编译时不是每回都报错),发现有错误。在登陆时一切正常,输入用户名密码后weblogic会报这个错误:

  <2005-2-28下午13时59分19秒 CST> <Error> <HTTP> <BEA-101020> <[ServletContext(id

=33038075,name=talkshow,context-path=/talkshow)] Servlet failed with Exception

java.lang.NullPointerException

        at org.apache.struts.tiles.definition.ComponentDefinitionsFactoryWrapper

.getDefinition(ComponentDefinitionsFactoryWrapper.java:124)

 

原因和解决方法:这是因为Struts框架本身的原因引起的,在修改Action之后重新启动这个Web应用就可以了。

怎样用Jbuilder建立运行于WEBLOGIC8下的AXIS实现的web service

问题描述:Jbuilder2005自己带AXIS组件包,可为什么编译提示错误。

-------------------------------

BUILD FAILED

C:\Documents and Settings\Administrator.KEVIN\jbproject\mypro\WebServiceDeploymentModules\Apache Axis\webapp\myweb\JbWebServiceDesigner\build_axis.xml:3: taskdef class

    org.apache.axis.tools.ant.wsdl.Java2WsdlAntTask cannot be found

Buildfile: build_axis.xml

Total time: 2 seconds

Error executing Ant, see output for details

------------------------------------------------

虽然提示有错,但却可以生成WAR包,并能正常在WEBLOGIC下发布。

可以访问服务,却不支持GET请求传递参数??

服务类:

public class Hello {

    public Hello() {

    }

 

    public String sayHello(String s){

        return "Hello,"+s;

    }

}

 

访问本机:http://localhost:7001/myweb/services/Hello?method=sayHello

返回XML:

- <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

- <soapenv:Body>

- <sayHelloResponse xmlns="">

  <ns1:sayHelloReturn xmlns:ns1="http://soho">Hello,null</ns1:sayHelloReturn>

  </sayHelloResponse>

  </soapenv:Body>

  </soapenv:Envelope>

--------------------------------

而我加上参数:

http://localhost:7001/myweb/services/Hello?method=sayHello&param=kevin

却提示如下:

AXIS error

Sorry, something seems to have gone wrong... here are the details:

 

Exception - java.lang.reflect.InvocationTargetException

----------------------

这到是什么原因啊?

原因和解决方法:在JBuilder2005的web services Designer的Module Settings中选择“Use saved designer output”一项。

然后手动更改已有的build_axis.xml:

....

    <path id="build-classpath">

      <pathelement path="D:\Borland\JBuilder2005\lib\axis.jar;D:\Borland\JBuilder2005\lib\axis-ant.jar;D:\Borland\JBuilder2005\lib\commons-discovery.jar;D:\Borland\JBuilder2005\lib\commons-logging.jar;D:\Borland\JBuilder2005\lib\saaj.jar;D:\Borland\JBuilder2005\lib\wsdl4j.jar;D:\Borland\JBuilder2005\lib\jaxrpc.jar"/>

    </path>

    <taskdef name="java2wsdl" classname="org.apache.axis.tools.ant.wsdl.Java2WsdlAntTask">

     <classpath refid="build-classpath"/>

    </taskdef>

    <taskdef name="wsdl2java" classname="org.apache.axis.tools.ant.wsdl.Wsdl2javaAntTask">

     <classpath refid="build-classpath"/>

    </taskdef>

....

 

其中的pathelement改成你本机上的目录。

 

再次编译即可成功。

jbuilder 的字符和光标对齐问题

大家常常说JBuilder在中文系统中存在光标错位的问题,都认为这是JBuilder的一个Bug,其实这实在是冤枉JBuilder了!大家讨论出来的解决方法无外乎两种:

 

1、将编辑器的字体改为宋体,用这种方法带来的问题是,在宋体下的英文字体实在难看,阅读起来不太顺眼;

 

2、就是将编辑器字体的粗体属性去掉,这样也影响代码的可读性。

 

  其实,造成JBuilder光标错位的问题并不是Borland的错误,而是Java的宗师——Sun的罪过!大家一定知道i18n吧?在不同的区域设置中,JDK自动调用与之相对应的properties文件,而在JDK中,Sun所推出的与中文系统相对应的properties文件存在问题,在它之中没有区分英文字体的正常、粗体和斜体,从而导致了以上所说的问题,解决的方法很简单,只要将这个properties文件修改正确就可以了,修改方法如下:

在jre/lib目录中找到font.properties.zh文件,编辑这个文件并修改成如下内容:

 

# @(#)font.properties.zh1.16 00/10/06

#

# AWT Font default Properties for Chinese Windows

#

 

 

dot dot dot

dot
  作者其它文章
您对本文的评价
您对这篇文章的看法如何?
太棒了!5分 不错啊 4分 一般般 3分 有待提高 2分 不好 1分

   
相关技术