Eclipse构建项目时需要注意的地方

这个本来应该是写在项目组开发BLOG上的。但最近换了办公环境之后,项目组原来的BLOG服务器搬到其它地方去了。现在还没有恢复项目组内部BLOG,所以,记在这里,待日后再恢复吧:)

昨天代码从一个分支Merge到主干版本,我的本地开发环境建立上有问题。连续出现在新开发环境中无法运行测试用例。跟踪发现是项目中使用的实体工具的问题。究其原因在于系统无法找到hibernate.cfg.xml文件。

我们知道JAVA程序在编译的时候,是通过CLASSPATH来访问各种资源,很明显的,hibernate.cfg.xml是放在Eclipse的CLASSPATH路径下的。(因此,我将需要使用的这些文件都作为src,那么自然这些文件都会在CLASSPATH的路径中)实体工具使用的datasource.xml配置正确,hibernate.cfg.xml关于hibernate的configuration也配置正确,但是DOCTYPE定义不对

[code]
<!DOCTYPE rootElement PUBLIC "PublicIdentifier" "URIreference">

<!DOCTYPE rootElement SYSTEM "URIreference"[
declarations
]>

[/code]
PublicIdentifier 提供一个独立的标识符,有些 XML 分析器可以使用该标识符引用 DTD,代替 URIreference。如果使用分析器的系统没有网络连接,或该连接可能会明显减慢处理速度,可以使用此标识符。

在实际中
[code]
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
[/code]
这样写才是符合规范的。

[code]
<!DOCTYPE hibernate-configuration SYSTEM "hibernate-configuration-3.0.dtd">
[/code]
定义成这种方式,最主要的问题是如何找到hibernate-configuration-3.0.dtd这个文件,具体放到那个目录下呢?

以前读DOCTYPE解析代码的时候,发现它就是从文件系统中找。但是,加载位置非常奇怪,如果是<!DOCTYPE hibernate-configuration SYSTEM "/hibernate-configuration-3.0.dtd">,那就是应用所在的根目录地址,比如:d:\

现在这么写的话,这个目录在什么地方呢?有几个地方,一个在CLASSPATH下,已经证明错误。在什么其它地方?莫非在ECLIPSE的Classpath下?这就真的不清楚了。事实上这个问题非常让人困扰。

如果我们的引用要解析XML文件需要用到的DTD在远端,显然不合适。想了一下,我们直接在DOCTYPE中定义文档类型结构定义不就OK了么?
代码如下:


[code]
<!DOCTYPE hibernate-configuration [

<!ELEMENT hibernate-configuration (session-factory,security?)>

<!ELEMENT property (#PCDATA)>
<!ATTLIST property name CDATA #REQUIRED>

<!ELEMENT mapping EMPTY> <!-- reference to a mapping file -->
<!ATTLIST mapping resource CDATA #IMPLIED>
<!ATTLIST mapping file CDATA #IMPLIED>
<!ATTLIST mapping jar CDATA #IMPLIED>
<!ATTLIST mapping package CDATA #IMPLIED>
<!ATTLIST mapping class CDATA #IMPLIED>

<!ELEMENT class-cache EMPTY>
<!ATTLIST class-cache class CDATA #REQUIRED>
<!ATTLIST class-cache region CDATA #IMPLIED>
<!ATTLIST class-cache usage (read-only|read-write|nonstrict-read-write|transactional) #REQUIRED>
<!ATTLIST class-cache include (all|non-lazy) "all">

<!ELEMENT collection-cache EMPTY>
<!ATTLIST collection-cache collection CDATA #REQUIRED>
<!ATTLIST collection-cache region CDATA #IMPLIED>
<!ATTLIST collection-cache usage (read-only|read-write|nonstrict-read-write|transactional) #REQUIRED>

<!ELEMENT event (listener*)>
<!ATTLIST event type (auto-flush|merge|create|delete|dirty-check|evict|flush|flush-entity|load|load-collection|lock|refresh|replicate|save-update|save|update|pre-load|pre-update|pre-insert|pre-delete|post-load|post-update|post-insert|post-delete|post-commit-update|post-commit-insert|post-commit-delete) #REQUIRED>

<!ELEMENT listener EMPTY>
<!ATTLIST listener type (auto-flush|merge|create|delete|dirty-check|evict|flush|flush-entity|load|load-collection|lock|refresh|replicate|save-update|save|update|pre-load|pre-update|pre-insert|pre-delete|post-load|post-update|post-insert|post-delete|post-commit-update|post-commit-insert|post-commit-delete) #IMPLIED>
<!ATTLIST listener class CDATA #REQUIRED>

<!ELEMENT session-factory (property*, mapping*, (class-cache|collection-cache)*, event*, listener*)>
<!ATTLIST session-factory name CDATA #IMPLIED> <!-- the JNDI name -->

<!ELEMENT security (grant*)>
<!ATTLIST security context CDATA #REQUIRED> <!--the JACC contextID-->

<!ELEMENT grant EMPTY>
<!ATTLIST grant role CDATA #REQUIRED>
<!ATTLIST grant entity-name CDATA #REQUIRED>
<!ATTLIST grant actions CDATA #REQUIRED>
]>
[/code]

这样,系统在解析hibernate.cfg.xml的时候也不用去找dtd定义,直接读取这个文件就OK了。问题到此已经解决了。

回想一下,XML当初要把DTD分离出来就是为了复用的目的,但是,在我们的应用场合,我们不需要这样的复用。相反,都放在一个文件当中效率还提高了。真是两极矛盾。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值