eclipse中创建的File文件怎么修改eclipse 字体颜色方案(注:不是class中代码的颜色,代码颜色我调好

本人使用IntelliJ IDEA其实并不太久,用了这段时间以后,觉得的确很是好用。刚刚从Eclipse转过来的很多人开始可能不适应,我就把使用过程中的一些经验和常用功能分享下,当然在看这篇之前推荐你先看完,这篇文章对自动完成的特性介绍的非常好,只是快捷键说明部分还可以更完善一些,可以照顾下默认绑定键位不一致的童鞋。本文在说明快捷键的时候是根据Mac OSX 10.5+的默认keymap,当然也会提供相关的文字说明,如果和我的绑定不一致的可以直接去keymap中搜索即可。
这个以前在Eclipse中是个很简单的问题,转移到IntelliJ上以后的一些人也问过这个问题。使用同样的方式设置了以后发现只是对当前文件起作用了,打开另外一个文件依然没有行号。就好比你只是在vim中执行命令set number,而不是在.vimrc中设置一样的效果。这个是需要在IDE Settings中设置下的,如图所示勾选即可:
其他设置可参照该设置项勾选即可,例如显示空格等等.
文件和导航关联
我们在写代码的时候经常需要打开某个文件的时候,想在左边的文件树上自动打开关联到位置,这样很方便的找寻本目录下的其他文件或者其他的相关文件,其实这个IntelliJ提供了好几种解决方案,第一个就是和Eclipse一样的方式,如下:
以前在Eclipse中设置也很简单,但是IntelliJ里面稍微有点不一样,如果想临时一次的话,打开文件的时候点击下图的小地球(第一眼看的时候很像个小地球仪)图标即可
如果你想和Eclipse的那个一样,让这一切自动的话,那么在上图的浮层中可以看到两个选项AutoScroll to Source和AutoScroll from source,IntelliJ很人性化的分了两个设置在里面,你两个都勾选就是基本和Eclipse的功能保持了完全一致,只是勾选一个自然也可以.
还有一种方式就是利用IntelliJ提供的Navigation Bar,IntelliJ很多功能操作都可以键盘化,这个就是喜欢键盘化操作的人的必备功能,操作方式就是打开文件的时候,使用快捷键?+UP (Jump to Navigation Bar),然后就会出现一个下拉,基本就是这个文件所在目录的文件列表,还可以使用上下左右的键位来选择其他目录,是不是很酷?
备注:此处建议把View & Navigation Bar的选项点掉,这样就使用快捷键之后就会在你鼠标的位置出现,感觉会更输入一些,当然这样你就基本失去了使用鼠标的权利,这个需要你根据个人癖好使用即可。
快捷键使用
如果你是苹果电脑用户的话,建议你改成Mac OSX 10.5+的键位绑定,因为Mac OSX 10.5这个兼容Windows的版本的键位实在是太蹩脚了,用着是真难受,好比你默认习惯?+w是关闭标签,在这个键位绑定中竟然是根据符号选择文本的一个快捷键.
这里主要介绍几个可能大家常用的,或者是你可能并不知道IntelliJ中有的几个快捷键,特别常用的你直接参照官网的Keymap介绍就可以了。学会在Keymap中自己查询需要的快捷键是主要的,不要每次都打开那个没用的百度,具体可以参照本文最后给出的链接。
Outline调出
以前在Eclipse中用的很多的一个快捷键就是ctrl+o,这样可以调出代码文件的所有成员变量和方法,并且可以支持搜索很是方便,IntelliJ这种基本的功能自然是有,新手的话还经常问,这个在IntellJ中的快捷键是?+F12 (File Structure)。如果你不是Mac OSX 10.5+键位绑定的话,小括号中的内容就是你可以去Keymap中去搜索的内容。
复制整行或者块:在Eclipse中使用ctrl+alt+Up,IntelliJ默认是?+D (Duplicate Line or Block),其实这个和Eclipse中的有差距,尤其是多行的时候或者选中内容的时候,不信你可以试试。所以你可以把Keymap中的Duplicate Lines定义上一个快捷键,我定义的是Option+D,这个键位在我的默认绑定中是没任何快捷键的,你可以自己绑定一个试试。
根据符号选择文本:这个键位用的太多了,并且也是非常的好用,举个例子,有这样一行代码&name&SpringSource Milestones Proxy&/name& 你光标在Milestones中的某一个位置,你想替换SpringSource Milestones Proxy为其他单词,假设想替换为Test XX,其实这样你只需要Option+Up (Select Word at Caret)两下就可以选中你想要的单词了,当你想在开发过程中,你会发现这个键位用的太多了,多到换了其他没有这个键位的编辑器或者IDE上,很是不习惯。
删除整行: 可以直接?+delete (Delete Line)或者利用IntelliJ智能的功能,剪切的快捷键,当本行选中文本的时候剪切`?+x会按照选中的文本实现剪切,但是你本行内无任何选中文本的时候会自动剪切整行,那么自然就类似一个删除本行的快捷键,但是这个其实还是比较蹩脚的,建议使用?+delete。
想直接跳转到接口的实现方法: ?+option+鼠标单击或者?+option+B。
语句自动完成 Statements completion:这个在中已经说明,这里还是着重说下,因为的确很好用,也强烈推荐下,还有文中说的智能自动完成 ctrl+shift+Space,当给你的提示太多的时候,这个键绝对会给你惊喜.
同样单词之间跳转:在Eclipse中的快捷键是ctrl+k,这个挺好用的,在IntelliJ中也不缺这个功能,但是在Mac OSX 10.5+的键位绑定中默认为空。据说Windows的默认绑定中是有绑定的,自己可以查询下,我自己绑定了一个?+ctrl+k (Find Word at Caret),没有的需要自己绑定一个,然后还能结合其他的键位实现上一个?+G (Find Next)下一个?+Shift+G (Find Previous)的功能.很是实用。
版本控制设置
我们开发肯定是有版本控制的,大家以前Eclipse的时候在本地文件和版本库不一致的时候,那么文件以及所在的文件夹都会出现一个〉表示,大家能很轻松的看到本地文件修改了哪一些,但是IntelliJ中默认是不能这样的。仅仅是给变化的文件在修改的时候提供了颜色上的变化,不包括其所在的各个父级文件夹哦,如果想和Eclipse一样的话需要如下图把设置勾选就可以了
其实看英文解释就可以明白了,这个默认开启以后如果想调整文件夹的显示颜色的时候就直接去Settings & Editor & Colors & Fonts & File Status中调整即可了,可以调整成自己喜欢的样子。
Java资源文件非英文的情况显示
IntelliJ在资源文件这方面个人觉得也是完胜Eclipse的,在Resource Bundle方式下想修改一个属性是相当方便的,可以在一个操作界面上修改所有语言的属性,这一切都是自动完成的,如下图所示:
并且还很贴心的有一个排序和分组的功能,尤其是这个排序。
默认设置下也有一个问题,就是中文默认会显示为Unicode码的,其实勾选一个设置(Settings & File Encodings)就可以了,如下图:
这样设置以后所有Unicode显示的就可以自动转化为其应该显示的语言了.
符合Maven约定结构的web项目如何更好的运行
记得刚开始用Eclipse的时候那时候默认是不支持Java EE项目的,必须使用一个MyEclipse的插件,直到今天好似还有人在用这个玩意,当年的时候每个Web项目修改之后都必须Deploy一下,修改的东西才会被执行,很是痛苦。后来就自己利用Tomcat插件,这个可以保证你修改jsp以及静态文件的时候不需要Deploy直接就可以被执行,因为Tomcat的目录指向其实直接是指向到了你的项目文件,这样的确省心了很多。
在IntelliJ中如果你是传统的Java EE的结构(根目录下面有src,webMoudle这样的结构),那么在直接在Run Configurations中添加一个Tomcat即可,点击+号添加即可(当然需要注意虽然没搜索框,你输入字符会自动给你筛选结果),这样运行的时候修改Java文件的话需要主动Make Project也就是?+F9 (Make Project).但是如果你是符合maven约定的项目结构的话如果继续这样配置就很不理想了,每次修改了jsp文件竟然也需要Make Project才可以,因为每次Make Project以后IntelliJ会自动给你DeployMent,这样好似又回到了几年前那种很麻烦的环境.
这个问题其实很容易解决,就是不要使用这种方式来运行你的web项目,既然符合maven结构的项目自然是使用maven或者gradle这种构建工具了,那么你需要利用maven的jetty的插件来运行项目即可了,如下图配置即可:
当然你也可以如下图直接点击运行就会自动添加一个:
参看上图其实也没必须非用jetty,用tomcat6或者tomcat7的插件运行也可以。
Eclipse的web结构项目如何导入和运行
鉴于有一些用户还没转型Maven等来构建项目,当然我也衷心的说一句,构建这块还是赶紧转了吧.因为不转的话还单独出来这个章节,并且有的操作还是相当麻烦,下面也会讲到,还是一一道来吧,导入的时候有两个选择然后我分两个部分说明,点击File & Import Project…,然后选择你的项目目录,点击OK,如下图:
使用新建项目来导入
这个方式图中所示的第一种,导入基本就是一路next到完成,但是你第一次也可以费点心思注意下每一步做了啥,例如帮你分析了jar有哪一些,如果你使用了Spring还给你分析你的所有配置文件。最后完成以后项目就开始构建索引,等一切就绪以后我们就可以完成的基本配置了,由于是web项目基本上能够在Tomcat等服务器上跑起来就基本算成功了。主要几个点:
处理好依赖关系,因为我们没使用maven,所以你得自己动手丰衣足食了
设置java文件的编译路径,如果需要的话
添加你的Tomcat,运行成功
打开File & Project Structure ,本节我们主要用到下图几个标红的部分:
我们先了解下这几个主要部件:
SDKs:主要存放了我们的JDK等,如下图(我自己下载带source的JDK,这样可以直接查看JDK相关的Java源代码):
Global Libraries:主要是公用的jar文件,例如servlet的几个jar可能每个项目都需要,但是Eclipse的变量在此变得不好使,所以需要使用这个地方来配置,如下图参照使用即可:
Facets:在此不做介绍,如有需要后续添加
Libraries:这里基本是项目的库,不是全局的,导入的项目一般都会把你Eclipse中的。classpath中的所有的依赖都导过来作为一个lib库,然后应用到你的项目的模块中
Modules:这个基本包括了项目的模块,通常来说Eclipse的项目结构中是单模块的
我们需要做的配置主要在Modules中,其他的几个自己根据理解配置即可。
我们先查看Modules中的Sources,如下图:
把项目所有的源码都添加即可,图中所示我的项目中其实少了resource的文件夹,这样我选中resource然后点击Sources即可,这样就会在左边的Source Folders中添加一个resource的文件夹。
然后是Paths部分,这个主要是class的输出路径,默认是在根目录下的out文件夹中,如果项目中对配置文件的解析等有写死路径,必须严格遵循Java EE的规范的话,那么需要将此部分修改如下(如果不存在我假设的情况可忽略本步骤):
然后的Dependencies,就更好配置了,添加需要的依赖即可。
这些步骤完成以后我们就可以点击Run & Edit Configurations ,点击左上角的+号,然后选择**Tomcat & Local Server **,这些步骤和Eclipse类似,选择相应路径等等,只需要注意一点就可以,就是需要添加一个DeployMent,如下图:
如果是Windows的图中的DeployMent中的+号可能是在右侧,点击之后会弹出对话框选择文件夹,选择eclipse默认的webMoudle文件夹即可(MyEclipse就是WebRoot文件夹),这个一定不能选错,不要选成项目的主文件夹,否则运行就不成功了,再然后ctrl+R运行即可。以debug方式运行就是ctrl+D。
使用IntelliJ对Eclipse项目的支持导入项目
基本参照上个基本都类似,就是步骤比上个步骤要少点,如果出现问题参照上个章节即可。
HQL查询支持
以前Eclipse有个HQL的插件可以直接输入HQL语法,查询测试结果是否正确,在IntelliJ中你也可以,不过不需要任何插件默认提供支持的,如果在导入项目的时候没有自动添加Hibernate的支持的话,那需要添加一下Hibernate的支持,鼠标选中项目,点击右键如下图:
点击选择Hibernate即可,如果没有Hibernate应该是项目已经自动添加了Hibernate的支持了。然后完成以后就可以如下图操作即可:
选中上面HQL图标,在出来的控制台输入你想输入的HQL即可了,一样可以自动完成的哦。
IntelliJ对于文件是默认随时保存的,基本不需要你?+s(这个键位默认是保存所有),所以需要注意不要随手不小心把某个文件改了下,然后直接关闭标签了,其实你的无意的操作已经导致修改了文件,可能导致你在项目运行的时候发现一个很离奇的错误,我暂时没发现可以关闭自动保存的设置,如果你对此非有强迫症的话,vim的插件可能会帮助到你。
IntelliJ中的文件是实时和本地文件同步的,所以Eclipse的刷新功能就不要问了,因为在这根本不需要那个功能。有的编辑器会提醒你是否和本地文件更新,这里也是默认不给任何提醒的,只要你修改了,这里就会立即自动同步更新文件。
在主菜单File下面,有个奇怪的Power Save Mode,这里也说明下,这个顾名思义是省电模式。当你勾选此模式以后,IntelliJ不会给你完成任何自动完成的功能,例如本来你输入一个字符会自动提示的,勾选以后就没有了,如果出现此问题的话可以考虑是不是自己手贱点过这个按钮噢,这个还是比较适合开会的时候无聊看代码用的,又省电又不影响你看代码。
Eclipse中有个F2的功能,可以查看到Java文件定义,你在Spring的配置文件中可能需要配置这个值,但是在IntelliJ中这个是不需要的,因为对于Spring这样的支持很是完善,你只需要在class的属性中输入class的名字然后ctrl+空格 (Basic 这个在code的completion下面)自动就完成了全路径,在智能的条件下可能就不需要蹩脚的实现。
项目刚开始导入或者清除cache重新打开的时候,下面的状态栏部分会显示Indexing,这个时候你就等着就可以了,基本你想做的事情什么都不能做,别在这个时候着急点来点去,不过它索引的速度挺快的,别着急。
Eclipse有个Save Actions的功能,主要是针对Java可以自动格式化以及优化import等功能,这个在IntelliJ上其实默认是没有的,想在IntelliJ中使用这功能可以使用以下两个思路:
利用宏录制,宏在开始以后你就格式化下代码,然后优化下import等操作,然后结束把宏定义一个?+s,不过问题就是不管什么文件都会执行这个宏,不仅仅是java文件,我就是利用这个宏主要完成把tab转为空格。
使用Eclipse Code Formatter的插件,这个插件基本和Eclipse默认的功能类似,但是也有少许区别,用户自己思量是否使用即可。
在Mac下IntelliJ代码区域是支持手势放大的,这个在给别人演示的时候很是方便。但是Run、Debug等视图的时候默认能使想到的就是手动的拖动大小,很是不便。你可以尝试下?+shift+up/down (Stretch to Top / Bottom),当然其他的project视图等的也都可以利用这个快捷键配置上下左右的方向键来配置使用,方便的很,强烈推荐使用。
IntelliJ 很少会见到搜索框,其实在没有搜索框的地方你试试直接输入拼音,例如你在 Project 的视图,打开目录树以后你直接敲入字母,如果有符合条件的记录那么会有高亮显示的。
第一次发文,如果有什么问题欢迎留言交流,原始文档放在上,各位如果也有一些技巧不妨共同完善下本文档。只需要Fock然后Pull Request就可以了,如果你觉得有个github帐号过于麻烦的话,那我个人觉得你还是转行比较合适。如果不想更新只是想订阅持续更新的内容,只需要Watch该项目即可。还可以对项目Star,这样你就可以在自己的帐号页面快速找到本项目。
Mac OS 快捷键
这文章好。
试用了IntelliJ IDEA,好卡
请问一下,InterlliJ IDEA怎么像Eclipse一下建立完整包名呢?
我装了jetty后,改了后台java代码不生效,make module后jetty就重启了
其实还可以多加点android开发环境的配置和快捷键使用介绍。
楼主最好写些maven在IDEA中得技巧..debug那些的...期待着
这个地址也是别人更新的技巧..不过这些大部分都是前端开发的人/damao/Intellij-IDEA-F2E
速度快太多了,Eclipse 怎么就是没长进
IntelliJ IDEA真的比eclipse更智能一些
老实说,Intellj IDEA智能程度确实不错,但是有几点内容我实在是无法适应:
1、泛型,包导入 xxx.* 等时候不像Eclipse一样显示warning,我可不想日后再导入Eclipse里的时候全是黄色warning。(如果知道怎么解决这个问题还请告知一下)
2、IDEA下的Maven貌似可以不遵守规范。1)maven 3.x已经明确说明的,弃用profile.xml文件,仍然可以正常使用。2)环绕依赖问题竟然可以决绝!这个太神奇了。3)maven项目要深挖N层才能显示类文件。
3、快捷键可以说是史上最难用。主要原因是以3个组合键居多。很常用的也都是3个组合键。
做java开发我倒是一直在用Eclipse,但是几个月前试着尝试过Intellj一周,最后不得不放弃。其实JetBrains的RubyMine我是一直在用的,Mac下很好用。OSChina 2折卖的时候首先入手的RubyMine,然后想着如果能适应Intellj IDEA的话也入手一个,最后放弃了。我有网站源代码src文件,怎么用eclipse去导入这些源代码,并重新编译,生成class文件_百度知道
我有网站源代码src文件,怎么用eclipse去导入这些源代码,并重新编译,生成class文件
我有网站源代码src文件,怎么用eclipse去导入这些源代码,并重新编译,生成class文件
能不能说具体点啊,我没用过这个软件啊
提问者采纳
不太容易了,把它复制进去就行了,它就有src目录,在eclipse里新建一个web 项目。当然如果它是eclipse项目的话,直接导入就行了
提问者评价
能不能具体点啊,没用过这个软件啊
其他类似问题
您可能关注的推广
class文件的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.002 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益developerWorks 社区
代码生成技术是项目建设中常用的减轻工作量的方法,但大部分开发人员对 Eclipse 平台下的代码生成技术了解不多。本文详细介绍在 Eclipse 平台下进行代码生成的技术,包括 Eclipse 自身模板引擎 JET 的使用,进行 Eclipse 项目生成使用的技术,以及在 Eclipse 平台下进行代码生成的相关辅助技术。本文对软件架构师和 Eclipse 开发人员都将有所裨益。
(), 软件架构师, 中国人民银行软件开发中心
吕锋,环境工程学士,计算机应用硕士,2007 年起从事人民银行软件开发平台研制及新技术研究。
(), 软件架构师, 中国人民银行软件开发中心
于沛,经济学学士,计算机应用硕士。自 2002 年起在人民银行从事信息系统建设,参与过多项国家重点项目建设,对 J2EE 技术有丰富经验,现主要从事人民银行软件开发平台研制。
(), 软件架构师, 中国人民银行软件开发中心
王轩,计算机科学与技术学士,软件工程硕士,2006 年起从事人民银行软件开发平台研制及新技术研制 , 对 Eclipse 平台技术有丰富经验。
Eclipse 的 JET 技术JET 技术介绍Eclipse 的 Java Emitter Templates(JET)一个开源的模板引擎,其功能是在 Eclipse Modeling Framework(EMF)中生成代码。 JET 的语法与 JSP 语法比较相似,但它们处于不同的应用领域。JET 的模板文件(template files)后缀一般为(*.jet),但为区分生成文件的类型建议扩展名采用生成文件类型加 jet 后缀的方式,如 ***.javajet、***.textjet 等。org.eclipse.emf.codegen.jet.JETEmitter 是 JET 的核心类,其 generate() 方法完成实现两个功能,将模板文件转换为模板执行类(template implementation class)然后通过模板执行类的输出生成相应的代码或文本。图 1. 文本生成流程图JET 应用示例本文随附三个示例源码,下文描述的三个示例分别对应示例源码中的 demo1、demo2 及 demo3,示例中具体方法写在示例源码中 SampleNewWizard 的 doFinish 方法中。将示例项目以 Eclipse Application 方式运行后,在新运行的 Eclipse 平台上选择菜单 File?New?Other,在弹出的 New 对话框中选择 JET Sample Wizards Demo1 至 Demo3,在弹出对话框中填入相应内容即可显示示例效果。图 2. JET Sample Wizards下文用三个示例来演示 JET 的功能和用法。示例 1 演示使用 JETEmitter 类生成简单的文件。示例 2 利用 JET 中的骨架 (skeleton) 技术对模板编译后的模板执行类进行方法定制。示例 3 利用类 JMerger 与合并规则达到自动生成代码与手工代码合并的效果。示例 1 简单的文件生成(demo1)1 编写模板,JET 语法与 JSP 语法很相似。下面是一个最简单的带有参数的模板文件 demo1.jet 。清单 1. Demo1.jet&%@jet package="demo.translated" imports="java.util.List" class="Demo1"%&
Hello, &%=((List)argument).get(0).toString()%&!
The current time is &%=new java.util.Date()%&.模板文件一般放在插件项目的 templates 目录下,模板中的 argument 是 JET 的隐含变量,它代表用户的输入参数 , 一般是数据变量集。模板的第一行表示生成内容的包路径为 demo.translated,模板执行类是 Demo1.java,该类 import java.util.List 。第二行和第三行是 JET 需要生成的文件内容,使用 &% …… %& 包括代码,使用 &%= …… %& 打印表达式的值,与 JSP 类似,正确地使用 &% …… %& 标签就可以添加任何逻辑循环或结构,其内容很好理解,但 JET 生成代码中,常量字符串最终要以变量的形式存在,于是其生成内容如下:清单 2. 生成内容package demo.
import java.util.L
public class Demo1
protected static S
public static synchronized Demo1 create(String lineSeparator)
nl = lineS
Demo1 result = new Demo1();
public final String NL = nl == null ? (System.getProperties().
getProperty("line.separator")) :
protected final String TEXT_1 = "Hello, ";
protected final String TEXT_2 = "!" + NL + "The current time is ";
protected final String TEXT_3 = ". ";
protected final String TEXT_4 = NL;
public String generate(Object argument)
final StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(TEXT_1);
stringBuffer.append(((List)argument).get(0).toString());
stringBuffer.append(TEXT_2);
stringBuffer.append(new java.util.Date());
stringBuffer.append(TEXT_3);
stringBuffer.append(TEXT_4);
return stringBuffer.toString();
调用 JET 执行模板生成操作的代码如下:清单 3. 生成操作代码// 模板文件所在插件项目的名称
String pluginId = "jet3";
// 通过插件项目获得其路径(basePath)
String basePath = Platform.getBundle(pluginId).getEntry("/").toString();
// 模板文件在项目中的路径及文件名
String uri = "templates/echo.jet";
JETEmitter emitter = new JETEmitter(basePath + uri);
IProgressMonitor progress = new NullProgressMonitor();
// 声明一个 List 作为数据变量集的 container
List&String& argument = new ArrayList&String&();
argument.add(fileName);
argument.add("12334");
// 对当前模板进行转换并将需要输出成实际文件的内容返回以便通过输出流输出
String result = emitter.generate(progress, new Object[] { argument });示例 2 骨架(skeleton)的使用(demo2)实际应用中往往会有多个代码执行类调用公用的方法或变量的情况,这时候我们通常会希望能够对代码执行类加入特定的方法,或在代码的生成过程中定制处理。对这类问题 JET 提供了一种强大的解决方案,骨架(skeleton)。所谓骨架,简单来说是修改编译后的模板文件代码的样子。比如我们希望模板文件编译后的代码执行类要继承某个基类、实现某个接口、包含某个常量或方法,就应采用骨架技术。以下对示例 1 中的模板进行少许修改,以对骨架有一个基本的了解。在 templates 目录中,创建 demo.skeleton 文件,编辑其内容为清单 4. demo.skeleton 文件内容import java.util.D
public class CLASS {
public String s = "Mission Completed!";
private Date getCurrentDate() {
return new Date();
public String generate(Object argument) {
return "";
}在该文件中,我们 import java.util.Date 类,声明了 String s 及声明了方法 getCurrentDate(),这些内容将被合并到对模板文件进行编译后的代码中。此外,在文件中的类名“ CLASS ”在代码执行类中会被模板文件中的代码执行类类名替换。将 demo1.jet 文件修改为以下内容,并将文件另存为 demo2.jet 。清单 5. demo2.jet&%@jet package="demo.translated" imports="java.util.List" class="Demo2"
skeleton="demo.skeleton"%&
&%=((List)argument).get(0).toString()%&!
The current time is &%=getCurrentDate()%&.
&%=s%&经 JET 编译后的模板文件代码内容如下,其中红色文字为利用骨架合并的效果。清单 6. 模板文件代码package demo.
import java.util.D
import java.util.L
public class Demo2 {
protected static S
public static synchronized Demo1 create(String lineSeparator)
nl = lineS
Demo2 result = new Demo2();
public final String NL = nl == null ?
(System.getProperties().getProperty("line.separator")) :
protected final String TEXT_1 = "Hello, ";
protected final String TEXT_2 = "!" + NL + "The current time is ";
protected final String TEXT_3 = ". ";
protected final String TEXT_4 = NL;
protected final String TEXT_5 = NL;
public String s = "Mission Completed!";
private Date getCurrentDate() {
return new Date();
public String generate(Object argument)
final StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(TEXT_1);
stringBuffer.append(((List)argument).get(0).toString());
stringBuffer.append(TEXT_2);
stringBuffer.append(getCurrentDate());
stringBuffer.append(TEXT_3);
stringBuffer.append(TEXT_4);
stringBuffer.append(s);
stringBuffer.append(TEXT_5);
return stringBuffer.toString();
}在这里有一点需要注意,JET 对模板文件的编译只会将其内容编译到最后一个方法中。因此,骨架最后一个方法必须为 public String generate(Object argument),若将其他方法放在最后,代码执行类在将模板编译后与骨架进行合并时会出错。示例 3 使用 JMerger 实现代码合并(demo3)JET 可以根据事先编辑好的模板文件生成代码,并且还支持重复生成。实际项目开发中,有时需要将自动生成的代码进行手工修改,这时如果因某种原则需重新执行代码生成,会导致手工编写的代码丢失。在 JET 中解决此类问题的方法是代码合并技术,它能将自动生成的内容和手工编写的内容区分开,在必要时进行合并,JET 中负责合并代码的类是 JMerger 。本示例讨论利用 JMerger 对代码进行合并的技术。执行 JET 引擎的程序代码如下。清单 7. JET 引擎的程序代码// 模板文件所在插件项目的名称
String pluginId = "demo3";
// 模板文件在项目中的路径及文件名
String uri = Platform.getBundle(pluginId).getEntry("/").toString();
uri += "templates/demo4.jet";
// 声明 JETEmitter
JETEmitter emitter = new JETEmitter(uri);
IProgressMonitor progress = new NullProgressMonitor();
// 声明一个 Map 作为数据变量集的 container
Map argument = new HashMap();
argument.put("fileName", fileName);
argument.put("className", fileName.substring(0, fileName.indexOf(".")));
// 对当前模板进行转换并将需要输出成实际文件的内容返回以便通过输出流输出
String result = emitter.generate(progress, new Object[] { argument });
// 声明 JMerger
JMerger jmerger = new JMerger();
// 合并规则文件在项目中的路径及文件名
String uri2 = Platform.getBundle(pluginId).getEntry("/").toString();
uri2 += "/templates/emf-merge.xml";
// 声明 JControlModel,作为合并规则
JControlModel controlModel = new JControlModel(uri2);
jmerger.setControlModel(controlModel);
// 在 JMerger 中设置需要合并的源文件内容
jmerger.setSourceCompilationUnit(jmerger
.createCompilationUnitForContents(result));
// 在 JMerger 中设置需要合并的目标文件内容
jmerger.setTargetCompilationUnit(jmerger
.createCompilationUnitForInputStream(new FileInputStream(file
.getLocation().toFile())));
// 对 JMerger 中目标文件与源文件进行内容合并
jmerger.merge();
return new ByteArrayInputStream(jmerger.getTargetCompilationUnit()
.getContents().getBytes());示例的模板内容如下清单 8. 示例模板内容&%@jet package="demo.translated" class="Demo3"%&
package demo3;
public class &%=((java.util.Map)argument).get("className")%& {
* Target javadoc 11
* Target javadoc 14
* @generated
public void printMessage1() {
// This is my owner code
System.out.print("Will be replace");
System.out.println("Source code 1");
* Target javadoc 21
* Target javadoc 24
* @generated
public void printMessage2() {
// This is my owner code
System.out.print("Will be replace");
System.out.println("Source code 2");
}生成类加入手工代码后的代码清单 9. 加入手工代码后的代码/**
* Target javadoc 11
* Target javadoc 12
* Target javadoc 13
* Target javadoc 14
* @generated NOT this target delete or add a word NOT
public void printMessage1() {
// This is my owner code
System.out.print("This is user code");
* Target javadoc 21
* &!-- begin-user-doc --&
* Target javadoc 22
* Target javadoc 23
* &!-- end-user-doc --&
* Target javadoc 24
* @generated
public void printMessage2() {
// This is my owner code
System.out.print("This code will be replace");
System.out.print("Will be replace");
System.out.println("Source code 2");
}再次执行 JET,重新生成 XXXX,新的生成代码如下,其中 printMessage1 方法 @generated 被设置为 NOT,该方法的 javadoc 注释及方法体内容都不会被合并,printMessage2 方法 javadoc 注释中加入标签 &!-- begin-user-doc --& 和 &!-- end-user-doc --& 在两个标签中间的间隔部分的注释信息将会合并到自动生成的代码中。清单 10. 新生成的代码/**
* Target javadoc 11
* Target javadoc 12
* Target javadoc 13
* Target javadoc 14
* @generated NOT this target delete or add a word NOT
public void printMessage1() {
// This is my owner code
System.out.print("This is user code");
* Target javadoc 21
* &!-- begin-user-doc --&
* Target javadoc 22
* Target javadoc 23
* &!-- end-user-doc --&
* Target javadoc 24
* @generated
public void printMessage2() {
// This is my owner code
System.out.print("This code will be replace");
System.out.print("Will be replace");
System.out.println("Source code 2");
}对 JMerger 合并规则的描述的文章很多,本文不再累述。本例中使用的合并规则是插件 org.eclipse.emf.codegen.ecore 中的 emf-merge.xml 的内容。将其复制到项目的 templates 文件夹中即可达到效果。JET 技术总结Eclipse 中的 JET 技术作为 EMF 不可或缺的技术之一,其优势显而易见,易学、易用、易上手使开发人员可以在很短的时间就可以开始开发工作,其与 JSP 类似的模板语言也降低了模板开发时的门槛。它可以生成开发人员需要的任何格式的文本类型文件,例如 java、xml、sql 等等。此外 , 骨架技术使模板开发人员在针对特定类型模板文件编写时,可以进行单独优化,以减少开发人员的工作量。JET 支持代码合并功能,通过使用简便的代码和实现定义好的合并规则就可以将自动生成代码与人工手写代码有效的整合。但所有的事物都是有利有弊的,JET 也不例外。 JET 未提供专用的模板和骨架编辑工具,效率对开发效率造成一定影响。另外 JET 极大程度上依赖 Eclipse 的插件机制,而其模板和骨架在代码运行前无法很简便的得知其生成的模板执行类的内容也是件比较麻烦的事情。JET 与 M2T刚刚接触 JET 的开发人员会存在一个困惑,在 Eclipse 关于 EMF 的 org.eclipse.emf.codegen 插件项目中存在一层名称为 jet 的包路径,而 Eclipse 在项目 M2T 中也存在有 org.eclipse.jet 插件项目,它们有什么关系呢?org.eclipse.jet 一般称为 JET2,其内部很多关键类也都是用 JET2 作为类名的前缀,而 org.eclipse.emf.codegen 一般称为 JET,是 EMF 项目不可缺少的核心,其中很多关键类都是用 JET 作为类名前缀。但是即使是这样,有不少开发人员仍旧对其名称发生困惑,因此,Eclipse 在其网站中对这两者的名称已经正式发布,org.eclipse.emf.codegen 插件定名为 EMF.Codegen,org.eclipse.jet 插件定名为 JET,本文考虑到大多开发人员的描述习惯以及关键词与类名前缀的统一,文章中讨论的 JET 技术是指 Eclipse 的插件 org.eclipse.emf.codegen,也即俗称的 JET 技术,或 Eclipse 中 EMF 的 EMF.Codegen 技术。Eclipse 的项目生成技术在前文的描述中,利用 JET 技术中的类 JETEmitter 能够生成 JavaProject 。但实际项目开发的需求往往比这要灵活得多,可能需指定编译器、设置插件引用、设定 jar 包引用等。通过 org.eclipse.jdt.core 中的 IJavaProject 及 org.eclipse.core.resources 中的 Iproject 开发人员可以灵活调整 JavaProject 的属性。。下一示例演示 JavaProject 的创建及属性修改。该示例将创建名称为 demo 的 JavaProject图 3. demo 的 JavaProject 项目在 Package Explorer View 中的展示首先在当前 IWorkspace 中获得 IProject 的实例,并通过 create() 方法在文件系统中创建该 Project 。清单 11. 生成项目// 生成的项目的名称
String _projectName = "demo";
IWorkspace workspace = ResourcesPlugin.getWorkspace();
// 从当前 workspace 中获取 IProject 实例,其名称为 demo
IProject project = workspace.getRoot().getProject(_projectName);
// 创建项目
project.create(null);
// 对该项目进行描述,其内容输出到 .project 文件
IProjectDescription description = workspace
.newProjectDescription(project.getName());
description.setNatureIds(new String[] { JavaCore.NATURE_ID });
description.setLocation(null);
// 在当前 Workspace 环境中打开该项目
project.open(null);
// 在项目中设置刚设置的项目描述
project.setDescription(description, null);通过 JavaCore 将当前项目转换为 JavaProject,并将其原有的 source root 删除,由于 Project 默认的 source root 为项目的根目录而非 JavaProject 使用的项目下的 src 路径,需要对其进行修改,本文由于在后面将会介绍对 source root 的创建,因此在这里采用删除的方式,实际创建时可依据需要进行修改。清单 12. 生成 JAVA 项目// 在 JavaCore 中将当前 IProject 创建为 IJavaProject
IJavaProject javaProject = JavaCore.create(project);
// 获得生成项目中的 classpath 信息,并将项目中的 source 目录信息删除
// 由于在下面将重新生成项目的 source root,因此为了保证不重复,
// 在这里将多余的错误 source root 删除
List&IClasspathEntry& classpath = new UniqueEList&IClasspathEntry&(
Arrays.asList(javaProject.getRawClasspath()));
for (int i = 0, len = classpath.size(); i & i++) {
IClasspathEntry entry = classpath.get(i);
if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE
&& ("/" + project.getName()).equals(entry.getPath()
.toString())) {
classpath.remove(i);
}创建 JavaProject 的 classpath 信息,每个 IClasspathEntry 对应 classpath 中的一条细目,并将其加入到 classpath 中。清单 13. 生成 Classpath// 添加新的 classpath 细目,包括 source 目录,bin 目录运行时的 container
// 以及其他需要添加的如变量(variable),jar 包(library)等等
// 生成效果为 &classpathentry kind="src" path="src"/&
IClasspathEntry classpathEntry = JavaCore.newSourceEntry(new Path("/"
+ project.getName() + "/src"));
// 生成效果为
// &classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/&
IClasspathEntry jreClasspathEntry = JavaCore
.newContainerEntry(new Path(
"org.eclipse.jdt.launching.JRE_CONTAINER"));
classpath.add(classpathEntry);
classpath.add(jreClasspathEntry);
// 在此处可以创建其他需要的 classpath 信息通过 IFolder 在文件系统中创建项目需要的 src 文件夹和 bin 文件夹。清单 14. 生成 SRC 文件夹// 在 JavaProject 的文件系统中创建文件夹 src
IFolder sourceFolder = project.getFolder(new Path("src"));
if (!sourceFolder.exists()) {
sourceFolder.create(false, true, null);
// 在 JavaProject 的文件系统中创建文件夹 bin
IFolder runtimeFolder = project.getFolder(new Path("bin"));
if (!runtimeFolder.exists()) {
runtimeFolder.create(false, true, null);
}将设置好的 classpath 赋值给 JavaProject,其结果反映到 JavaProject 的 .classpath 文件中,并对 JavaProject 的 outputLocation 赋值,最后在当前 workspace 中打开该 JavaProject 。清单 15. 设置 Classpath 和 bin 目录// 将设置好的 classpath 赋值给 JavaProject
javaProject.setRawClasspath(classpath
.toArray(new IClasspathEntry[classpath.size()]), null);
// 设置 JavaProject 的 bin 目录
javaProject.setOutputLocation(
new Path("/" + project.getName() + "/bin"), null);
// 在当前 Workspace 环境中打开该项目
javaProject.open(null);以上内容可以创建基本的 JavaProject,如果多个 Project 之间存在引用关以,用 Iworkspace 创建引用关系清单 16. 设置项目引用// 获得当前 Eclipse 运行环境中的 IWorkspace 实例
IWorkspace workspace = ResourcesPlugin.getWorkspace();
// 从当前 workspace 中获取 IProject 实例
IProject project = workspace.getRoot().getProject(_projectName);创建 PluginProject 需要调用到 Eclipse 的 PDE 平台,其生成所需要代码在 org.eclipse.pde.core 中,具体生成方式可参看 org.eclipse.pde.ui 中 NewProjectCreationOperation 的 execute 方法。开发环境集成技术模板引擎和项目生成是代码生成工作中最重要的工作,完成这些内容,就已经完成了大部分工作。但实际项目开发没有这种简单,开发人员还会受到几个开发环境有关的问题的困扰,这些问题不但会使整个自动代码生成过程变得无趣,还在一定程序上影响开发人员的生成效率。本文只讨论在 Eclipse 平台下的解决。如果您正在使用的集成开发环境不支持扩展或没有开发的 API,可以考虑将项目转移到 Eclipse 环境。与配置管理工具集成企业级大型项目,往往需要可靠稳定的配置管理工具,常用的配置管理工具有 CVS、SVN、ClearCase、SourceSafe 等。 IBM 的 ClearCase 因其出色的能力,往往成为开发大型项目的首选,但 ClearCase 的工作原理与 SVN 有明显不同,它对文件的操作有严格的要求,需将加入版本控制的所有的文件设为只读,只有检出操作后才会改为可写,而且要检出代码也能在 ClearCase 中留下完成的版本控制记录,有利于项目的管理。这样就要求生成代码工具支持 ClearCase 的特性,需要时能够自动检出目标文件。幸运的是 Eclipse 的提供了统一的机制操作文件,并且提供编程接口。解决上述问题,有两个关键点:1. 需要找到配置管理工具的类型,在 Eclipse 中所有在 Workspace 中的资源类都会实现 IResource 接口,在其中有 getSessionProperty(QualifiedName key) 方法,该方法可以获得配置工具的类型代码如下清单 17. 获得配置管理工具对象// 获得配置工具对象
Object obj = resource.getSessionProperty(TeamPlugin.PROVIDER_PROP_KEY);
RepositoryProvider provider = (RepositoryProvider)
当 provider.getID().contains("clearcase") 为真的时候就能确定该资源使用 ClearCase 来管理。2. 从 ClearCase ChecktOut 资源FileModificationValidator 可以帮助我们完成 CheckOut 资源,具体代码如下清单 18. 从配置管理工具 CheckOut 文件// 从 RepositoryProvider 获得 FileModificationValidator
FileModificationValidator validator = provider.getFileModificationValidator2();
// 完成 CheckOut 操作
IStatus status = validator.validateEdit(new IFile[] { (IFile) resource }, null);当 status.isOK() 为 true 时文件证明文件 CheckOut 成功项目应根据需要显示提示窗口或自动完成检出操作。使用 Eclipse 的自动编译功能生成代码之后开发人员可能还需做一些手工操作,如识别文件变化、程序编译、配置类型文件处理等。为提升自动化处理程序,我们需要系统能自动发现文件变化,并自动进行处理。org.eclipse.core.resources.builders 扩展点提供了以上类型的机制。实现 Builder 扩展点,在 Extension 页中增加 org.eclipse.core.resources.builders 扩展点,并指定其实现类。该实现类必须继承 org.eclipse.core.resources.IncrementalProjectBuilder,过载下列方法protected abstract IProject[] build(int kind, Map args, IProgressMonitor monitor)
throws CoreE在项目资源发生变化时 Eclipse 将自动调用上述方法。方法参数请参阅 Eclipse 文档。这样可以在代码生成之后对文件变化做出自动处理。使用 Eclipse 的 Error Log 显示生成状态在 Eclipse 平台中进行代码自动生成时,应尽量使用 Eclipse 提供的控制台机制或问题处理机制,避免使用 Log4j 第三方工具。,一个是将错误输出到 Eclipse 的 Console 中。记录在文件中有多种方式就不在此详述。输出到 Console 中就需要使用 Eclipse 的提供的机制。要达到这个目的需要调用 Eclipse 的 ILog 接口实现代码如下清单 19. 使用 ILog 接口// 获得 Bundle
Bundle bundle = InternalPlatform.getDefault().getBundle(pluginid);
// 获得 ILog
ILog elogger = Platform.getLog(bundle);
得到 ILog 对象后可以记录以下几个级别的错误
//Cancel 级别
elogger.log(new Status(Status.CANCEL, pluginid + "-" + loc, message,throwable));
//Error 级别
elogger.log(new Status(Status.ERROR, pluginid + "-" + loc, message,throwable));
//Info 级别
elogger.log(new , pluginid + "-" + loc, message,throwable));以此方式可在Eclipse平台中显示生成状态信息,提高用户体验。结束语“自动代码生成技术”已成为项目开发不可或缺的一项技能,它通过自动生成文本的方式,减少开发工作量并防止缺陷产生。一般来说,开发人员仅使用模板引擎生成程序代码和数据文件,但从事大型项目开发时,这还远远不够。基于 Eclipse 开发环境,我们可以自动创建项目、添加依赖项、生成代码文件、编译或处理已生成代码、并与配置管理工作交互,甚至可以在 Eclipse 平台中显示执行进度和信息提示。本文融合笔者多年项目开发经验,涵盖自动代码生成工作的各方面技术。希望本文能对使用 Eclipse 平台的技术人员有所启发,在实践中深度发掘 Eclipse 平台的潜能,而不只是将之视为简单的集成开发环境。
下载描述名字大小样例代码19KB样例代码20KB样例代码22KB
在 developerWorks 上浏览所有的 。
不熟悉 Eclipse? 请阅读 developerWorks 文章 “”,学习它的起源和架构,以及如何用插件扩展 Eclipse。
通过查阅 IBM developerWorks
扩展您的 Eclipse 技术。
要收听针对软件开发人员的有趣访谈和讨论,请查阅 。随时关注 developerWorks 和。
查阅免费的 ,观看并了解 IBM 及开源技术和产品功能。
查阅最近将在全球举办的面向 IBM 开放源码开发人员的研讨会、交易展览、网络广播和其他 。
访问 developerWorks ,获得丰富的 how-to 信息、工具和项目更新,帮助您用开放源码技术进行开发,并与 IBM 产品结合使用。
上查阅最新的 。
从 Eclipse Foundation 下载 。 下载
或 ,并开始使用来自
DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。
改进您的下一个开发项目,这些软件可以通过下载获得。 应当是讨论关于 Eclipse 的问题的第一站(选择此链接将启动默认的 Usenet 新闻阅读器应用程序并打开 eclipse.platform)。 中有很多参考资料适用于对使用和扩展 Eclipse 感兴趣的人员。
并加入 developerWorks 社区。
developerWorks: 登录
标有星(*)号的字段是必填字段。
保持登录。
单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件。
在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。
所有提交的信息确保安全。
选择您的昵称
当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。昵称长度在 3 至 31 个字符之间。
您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。
标有星(*)号的字段是必填字段。
(昵称长度在 3 至 31 个字符之间)
单击提交则表示您同意developerWorks 的条款和条件。 .
所有提交的信息确保安全。
IBM PureSystems(TM) 系列解决方案是一个专家集成系统
通过学习路线图系统掌握软件开发技能
软件下载、试用版及云计算
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=Open sourceArticleID=420535ArticleTitle=基于 Eclipse 平台的代码生成技术publish-date=}

我要回帖

更多关于 eclipse护眼字体颜色 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信