(*:此文章为个人开发报告书,若有说错或者概念错误,希望来信silentbalanceyh@126.com,并且在评论里面给予纠正,谢谢提点)
1.开发环境:
开发用OS:Windows Server 2008
开发用IDE:Oracle Workshop for WebLogic 10.3.0(以前的BEA Workshop Studio)
开发Web容器:Tomcat 5.5.27
开发数据库:MySQL Community Server
AspectJ插件:http://download.eclipse.org/tools/ajdt/33/update (1.5.3-->1.6.x)
2.现象描述:
昨天晚上我在平台IDE上安装了AspectJ插件,因为网速原因,我直接从上边地址下载下来过后安装到IDE平台里面,安装的第二天,我的自动更新提示有新插件,所以我就更新了,更新过后第三天的时候出现了“插件冲突”,使得AspectJ插件可以使用,但是Java的代码编辑器出现了下边的现象:
所有的Java编辑器里面报错的地方,在Package Explorer工作区里面不报错,而且取消Eclipse的自动编译过后,直接编译了过后使得Eclipse不能输出Java的.class二进制文件了,然后在Tomcat容器中出现了ClassNotFoundException的异常。后来问题升华到Java代码里面即使有错也能够编译通过。
最开始以为是项目的代码问题,但是我把项目迁移到PC机的时候也出现了问题,然后创建了一个新的项目,环境和配置一模一样的,没有问题,可以运行,而且编译也会报错,所以怀疑Eclipse创建的项目文件出了问题。
3.配置文件浅析:
Eclipse创建工程过程:
首先:File-->New-->Project
(出现的导航视图里面,选择Web目录下的Dynamic Web Project,大部分WTP平台都可以创建此类型的项目)
然后选择好了过后直接选择(详细说明以保证不会有不同环境的误解,见谅!)
Dynamic Web Module(2.4)
Hibernate(3.2)
Java(6.0)
Java Annotation Processing Support(5.0)
JPA(1.0)
JSTL(1.1)
Eclipse创建了工程过后,会出现以下的目录结构:
其主要配置目录结构有三个:
目录:.settings
文件:.classpath
文件:.project
简单介绍一下此三个文件目录:(网上资料的整合版本)
.settings目录:此文件目录下边有以下文件,主要分析以下所有Eclipse都应该有的文件
org.eclipse.jdt.core.prefs内容:(写字板打开)
#Fri Oct 10 16:07:49 CST 2008
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.compliance=1.6
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.6
org.eclipse.jst.common.project.facet.core.prefs内容
#Fri Oct 10 16:07:49 CST 2008
classpath.helper/org.eclipse.jdt.launching.JRE_CONTAINER\:\:org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType\:\:Sun/owners=jst.java\:6.0
classpath.helper/org.eclipse.jst.server.core.container\:\:org.eclipse.jst.server.tomcat.runtimeTarget\:\:Apache\ Tomcat\ v6.0/owners=jst.web\:2.5
eclipse.preferences.version=1
(V猜测:这两个文件是Eclipse的工程的基本环境文件,其中第二个是基于Web项目的,只有Web项目会出现第二个环境配置,应该是与项目文件无关的,而且在项目相关操作中除非在配置里面修改,否则这些文件应该在每个工程下边都是一样的。)
.classpath文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jrockit_160_05"/>
<classpathentry kind="con" path="org.eclipse.jst.server.core.container/org.eclipse.jst.server.tomcat.runtimeTarget/Apache Tomcat v5.5"/>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
<classpathentry combineaccessrules="false" kind="src" path="/com.iknowing.sc.sitebao.v6.framework.service"/>
<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Compass2.1"/>
<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Lucene"/>
<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/MySQL"/>
<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Spring2.5"/>
<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Tiles2.0"/>
<classpathentry kind="src" path=".apt_src">
<attributes>
<attribute name="optional" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="build/classes"/>
</classpath>
上边文件描述了工程相关依赖文件:
1.源文件具体位置:<classpathentry kind="src" path="src"/>、kind="src"属性,其目录相对于Eclipse创建的工程根目录
2.运行的系统环境:主要指定了使用的JVM的类型,如果是Web项目,还有运行的Web容器的类型
3.这里有一个属性:combineaccessrules="false",此属性一般建立的时候是建立的一个项目应该不会出现,如果我们在创建项目的时候创建的是几个项目,项目发布相互需要依赖的时候就需要在此处设置,com.iknowing.sc.sitebao.v6.framework.service为我们自己创建的此发布项目的一个依赖项目。
4.项目的输出目录:kind="output"属性设置了项目的输出目录
在BLOG http://www.iteye.com/topic/257120 里面:还提及到library的具体位置kind="lib"的属性项以及配置的项目生成的文档的位置:"javadoc_location"等
(V猜测:在Eclipse里面我使用到的载入jar包的方式有以下几种:
1.直接将jar包Import到WEB-INF/lib下边,这种仅仅限制于WEB工程项目使用;
2.直接在Java Build Path里面添加外联的jar文件,添加的文件和系统使用的Library同级目录;
3.创建自己的User Library,然后在里面添加外联的jar文件,添加的库与系统使用的Library同级目录,jar文件为库的子目录
4.直接使用系统提供的Library
鉴于BLOG http://www.iteye.com/topic/257120 上提及到的kind="lib"可能是Eclipse载入jar包的方式属第二种或者第四种,而我使用的是User Library的方式,所以我这里显示的配置文件里面还是kind="con",只是这里使用Eclipse内部变量:org.eclipse.jdt.USER_LIBRARY,至于四种的好坏和四种到底好坏我不是很清楚,个人习惯来定吧!)
.project文件:
此文件为描述问题的文件出现位置,在我们安装了AspectJ插件过后,点击项目右键会多一个选项:
AspectJ Tools --> Convert To AspectJ Tools选项,一旦选择了转换过后,.project文件发生了变化:
转换项目之前:
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>com.iknowing.sc.sitebao.v6.framework.website</name>
<comment></comment>
<projects>
<project></project>
<!--依赖项目的项目列表-->
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.common.project.facet.core.builder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.m7.nitrox.nitroxbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
<nature>com.m7.nitrox.webProjectNature</nature>
</natures>
</projectDescription>
转换项目过后:
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>com.iknowing.sc.sitebao.v6.framework.website</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.ajdt.core.ajbuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.common.project.facet.core.builder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.m7.nitrox.nitroxbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.ajdt.ui.ajnature</nature>
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
<nature>com.m7.nitrox.webProjectNature</nature>
</natures>
</projectDescription>
主要出现在高亮度的两行里面,先看看网上大部分讲述的.project文件:
<name></name>标签:描述了工程的名称
<comment></comment>标签:关于工程的相关描述
<projects></projects>标签:里面有一个子标签<project></project>,包含了我们设置的依赖的项目的列表,比如你建立的项目A,项目A在build Path的Project标签里面添加了一个项目叫做B,则这个标签内就会出现一个<project>B</project>,这里B是代表了另外一个项目名,即另外一个项目的.project文件里面的<name></name>里面的值
<buildSpec></buildSpec>标签:(V猜测:里面包含了整个项目在编译过程中的编译规则,使用什么插件来驱动编译器进行编译,描述了Eclipse平台在整个项目Build过程中使用的命令、使用的模块、验证结构和语法等各种操作都在这里进行描述)
<natures></natures>标签:里面包含了Eclipse在启动时加载此项目需要使用的插件,如果启动很慢可以将一部分插件Cancel掉,这些插件会在启动过后打开相关联文件的时候自动加载进来,这样可以让Eclipse启动速度加快一点点(*:这种小做法并不能将Eclipse速度优化)
4.解决方案:
将<buildSpec></buildSpec>标签里面第一行org.eclipse.ajdt.core.ajbuilder替换成为org.eclipse.jdt.core.javabuilder:
分析:AspectJ的项目Convert之所以会改变编译规则,主要是因为AspectJ里面有它特殊的语法,比如关键字aspect和pointcut以及after和before等,所以这里可能修改掉了编译规则,而且使用插件org.eclipse.ajdt.ui.ajnature来进行语法作色,AspectJ插件使得开发AspectJ的项目会很方便。如果出现相同的现象页可以检查此处的编译规则是否在使用Java编译,因为Eclipse插件里面不仅仅只有此插件是新语法改变了规则的,很多提供了编辑器的插件都会修改掉相关的语法编译规则,这个只是一个侧面。
注意:此问题可能会因为以下情况出现——AspectJ插件出现插件冲突以使得Eclipse里面的AspectJ插件产生了错误而不能使用,而项目又不能回滚,使得编译Java文件没有效果,不仅没有输出的.class文件,而且使得Java编辑器不能正确判断编译时的语法错误而产生。
5.总结:
以上是我在使用AspectJ插件中遇到的一个错误情况,若有错误说法或者语言上的误差,望来信指点:silentbalanceyh@126.com谢谢!