2009-12-04 21:32:16| 分类: Eclipse PDE|字号 订阅
在上一篇中,我们已经建立了一个向导想生成项目,这一篇中将介绍怎样在Eclipse透视图中建立一个项目及所需的东西。
首先,我们在向导点击Finish完后,然后生成一个项目,如图:

这里就不多说了,贴出代码出来:
1
/**
2
*
@see
org.eclipse.jface.wizard.Wizard#performFinish()3
*/
4
public
boolean
performFinish()
{5
createJavaProject();6
if
(_newProject
==
null
)
{7
return
false
;8
}
else
{9
updatePerspective();10
selectAndReveal(_newProject);11
return
true
;12
}
13
}
14

15
/**
16
* 创建一个Java项目17
*/
18
public
void
createJavaProject()
{19
_newProject
=
createNewProject();20
IJavaProject ijavaproject
=
JavaCore.create(_newProject);21
try
{22
createOutputLocation(ijavaproject);23
addJavaBuilder(ijavaproject);24
setClasspath(ijavaproject);25
_newProject.build(IncrementalProjectBuilder.FULL_BUILD,
null
);26
}
catch
(JavaModelException e)
{27
e.printStackTrace();28
}
catch
(CoreException e)
{29
e.printStackTrace();30
}
31
}
32

33
/**
34
* 创建一个新项目35
* 36
*
@return
37
*/
38
private
IProject createNewProject()
{39
if
(_newProject
!=
null
)40
return
_newProject;41

42
//
得到一个项目的句柄
43
final
IProject newProjectHandle
=
_mainPage.getProjectHandle();44

45
//
得到一个项目的描述
46
IPath newPath
=
null
;47
if
(
!
_mainPage.useDefaults())48
newPath
=
_mainPage.getLocationPath();49

50
IWorkspace workspace
=
ResourcesPlugin.getWorkspace();51
final
IProjectDescription description
=
workspace52
.newProjectDescription(newProjectHandle.getName());53
description.setLocation(newPath);54

55
//
增加Java Nature,否则在ijavaproject.setOutputLocation这句就会出错
56
addJavaNature(description);57

58
//
创建一个项目的操作
59
WorkspaceModifyOperation op
=
new
WorkspaceModifyOperation()
{60
protected
void
execute(IProgressMonitor monitor)61
throws
CoreException
{62
createProject(description, newProjectHandle, monitor);63
}
64
}
;65

66
//
运行一个新的项目操作,即会执行op中的execute方法
67
try
{68
getContainer().run(
true
,
true
, op);69
}
catch
(InterruptedException e)
{70
return
null
;71
}
catch
(InvocationTargetException e)
{72
return
null
;73
}
74

75
_newProject
=
newProjectHandle;76

77
return
_newProject;78
}
79

80
/**
81
* 增加Java的Nature82
* 83
*
@param
iprojectdescription84
*/
85
private
void
addJavaNature(IProjectDescription iprojectdescription)
{86
ArrayList arraylist
=
new
ArrayList();87
arraylist.addAll(Arrays.asList(iprojectdescription.getNatureIds()));88
arraylist.add(
"
org.eclipse.jdt.core.javanature
"
);89
iprojectdescription.setNatureIds((String[]) arraylist90
.toArray(
new
String[arraylist.size()]));91
}
92

93
/**
94
* 创建一个新项目95
* 96
*
@param
description97
*
@param
projectHandle98
*
@param
monitor99
*
@throws
CoreException100
*
@throws
OperationCanceledException101
*/
102
private
void
createProject(IProjectDescription description,103
IProject projectHandle, IProgressMonitor monitor)104
throws
CoreException, OperationCanceledException
{105
try
{106
monitor.beginTask(
""
,
2000
);107

108
projectHandle.create(description,
new
SubProgressMonitor(monitor,109
1000
));110

111
if
(monitor.isCanceled())112
throw
new
OperationCanceledException();113

114
projectHandle.open(IResource.BACKGROUND_REFRESH,115
new
SubProgressMonitor(monitor,
1000
));116

117
}
finally
{118
monitor.done();119
}
120
}
121

122
/**
123
* 创建输出文件124
* 125
*
@param
ijavaproject126
*
@throws
JavaModelException127
*
@throws
CoreException128
*/
129
private
void
createOutputLocation(IJavaProject ijavaproject)130
throws
JavaModelException, CoreException
{131
IFolder ifolder
=
ijavaproject.getProject().getFolder(
"
bin
"
);132
createFolder(ifolder);133
IPath ipath
=
ifolder.getFullPath();134
ijavaproject.setOutputLocation(ipath,
null
);135
}
136

137
/**
138
* 增加Java生成器139
* 140
*
@param
ijavaproject141
*
@throws
CoreException142
*/
143
private
void
addJavaBuilder(IJavaProject ijavaproject)
throws
CoreException
{144
IProjectDescription iprojectdescription
=
ijavaproject.getProject()145
.getDescription();146
ICommand icommand
=
iprojectdescription.newCommand();147
icommand.setBuilderName(
"
org.eclipse.jdt.core.javabuilder
"
);148
iprojectdescription.setBuildSpec(
new
ICommand[]
{ icommand }
);149
iprojectdescription150
.setNatureIds(
new
String[]
{
"
org.eclipse.jdt.core.javanature
"
}
);151
ijavaproject.getProject().setDescription(iprojectdescription,
null
);152
}
153

154
/**
155
* 设置Classpath156
* 157
*
@param
ijavaproject158
*
@throws
JavaModelException159
*
@throws
CoreException160
*/
161
private
void
setClasspath(IJavaProject ijavaproject)162
throws
JavaModelException, CoreException
{163
ijavaproject.setRawClasspath(
new
IClasspathEntry[
0
],
null
);164
addSourceFolders(ijavaproject);165
addJRELibraries(ijavaproject);166
addCodeGenLibraries(ijavaproject);167
}
168

169
/**
170
* 增加JRE库171
* 172
*
@param
ijavaproject173
*
@throws
JavaModelException174
*/
175
private
void
addJRELibraries(IJavaProject ijavaproject)176
throws
JavaModelException
{177
ArrayList arraylist
=
new
ArrayList();178
arraylist.addAll(Arrays.asList(ijavaproject.getRawClasspath()));179
arraylist.addAll(Arrays.asList(PreferenceConstants180
.getDefaultJRELibrary()));181
ijavaproject.setRawClasspath((IClasspathEntry[]) arraylist182
.toArray(
new
IClasspathEntry[arraylist.size()]),
null
);183
}
184

185
/**
186
* 增加代码生成中所需要的Jar库187
* 188
*
@param
ijavaproject189
*
@throws
JavaModelException190
*/
191
private
void
addCodeGenLibraries(IJavaProject ijavaproject)192
throws
JavaModelException
{193
//
TODO:添加代码生成项目中所需要的Jar包
194
}
195

196
/**
197
* 增加多个源文件目录198
* 199
*
@param
ijavaproject200
*
@throws
JavaModelException201
*
@throws
CoreException202
*/
203
private
void
addSourceFolders(IJavaProject ijavaproject)204
throws
JavaModelException, CoreException
{205
ArrayList arraylist
=
new
ArrayList();206
arraylist.addAll(Arrays.asList(ijavaproject.getRawClasspath()));207
addSourceFolder(ijavaproject, arraylist,
"
src/java
"
);208
addSourceFolder(ijavaproject, arraylist,
"
src/resource
"
);209
ijavaproject.setRawClasspath((IClasspathEntry[]) arraylist210
.toArray(
new
IClasspathEntry[arraylist.size()]),
null
);211
}
212

213
/**
214
* 增加源文件目录215
* 216
*
@param
ijavaproject217
*
@param
arraylist218
*
@param
s219
*
@throws
CoreException220
*/
221
private
void
addSourceFolder(IJavaProject ijavaproject,222
ArrayList arraylist, String s)
throws
CoreException
{223
IFolder ifolder
=
ijavaproject.getProject().getFolder(s);224
createFolder(ifolder);225
IPackageFragmentRoot ipackagefragmentroot
=
ijavaproject226
.getPackageFragmentRoot(ifolder);227
arraylist.add(JavaCore.newSourceEntry(ipackagefragmentroot.getPath()));228
}
229

230
/**
231
* 创建一个文件夹232
* 233
*
@param
ifolder234
*
@throws
CoreException235
*/
236
private
void
createFolder(IFolder ifolder)
throws
CoreException
{237
IContainer icontainer
=
ifolder.getParent();238
if
(icontainer
!=
null
&&
!
icontainer.exists()239
&&
(icontainer
instanceof
IFolder))240
createFolder((IFolder) icontainer);241
ifolder.create(
true
,
true
,
null
);242
}
243

244
/**
245
*
@see
org.eclipse.jface.wizard.Wizard#addPages()246
*/
247
public
void
addPages()
{248
super
.addPages();249
_mainPage
=
new
WizardNewProjectCreationPage(
"
海迈平台-代码生成
"
);250
_mainPage.setTitle(
"
创建一个代码生成项目框架
"
);251
_mainPage.setDescription(
"
创建一个代码生成项目框架
"
);252
addPage(_mainPage);253
}
254

255
/**
256
* 更新Eclipse的透视图257
*/
258
protected
void
updatePerspective()
{259
try
{260
IWorkbenchPage iworkbenchpage
=
PlatformUI.getWorkbench()261
.getActiveWorkbenchWindow().getActivePage();262
if
(iworkbenchpage.findView(
"
org.eclipse.ui.views.PropertySheet
"
)
==
null
)263
iworkbenchpage.showView(
"
org.eclipse.ui.views.PropertySheet
"
);264
}
catch
(PartInitException partinitexception)
{265
partinitexception.printStackTrace();266
}
267
}
268

269
/**
270
*
@param
iresource271
*/
272
protected
void
selectAndReveal(IResource iresource)
{273
selectAndReveal(iresource, _workbench.getActiveWorkbenchWindow());274
}
275

276
/**
277
* 选择该项目并显示出来278
* 279
*
@param
iresource280
*
@param
iworkbenchwindow281
*/
282
private
void
selectAndReveal(IResource iresource,283
IWorkbenchWindow iworkbenchwindow)
{284
BasicNewResourceWizard.selectAndReveal(iresource, iworkbenchwindow);285
}
在创建新项目的时候,要给项目描述类增加一个Java Nature,具体这个Java Nature是什么意思我不太懂
。Eclipse里面很多都采用Adopter模式,所以在WorkspaceModifyOperation中的execute方法是创建项目的核心。其他可以参考代码。相信不是很难理解。
友情小贴士:
1.在点击“完成”按钮后,调用PerformFinish方法。
2.创建一个项目的时候,可以根据page来得到Project句柄,再根据ResourcesPlugin.getWorkspace();来得到工作区,由于每个工作区都含有多个不同插件的描述,可以从工作区创建一个项目描述:workspace .newProjectDescription(newProjectHandle.getName());并设置相应的路径(可以从Page中得到),并为项目描述增加一些必要的信息,如JavaNature。真正创建项目: projectHandle.create(description, new SubProgressMonitor(monitor,1000), projectHandle.open(IResource.BACKGROUND_REFRESH,new SubProgressMonitor(monitor, 1000));
3.为项目设置Java编译器,
ICommand icommand = iprojectdescription.newCommand();
icommand.setBuilderName("org.eclipse.jdt.core.javabuilder");
iprojectdescription.setBuildSpec(new ICommand[] { icommand });
4.为项目设置源路径
ArrayList arraylist = new ArrayList();
arraylist.addAll(Arrays.asList(ijavaproject.getRawClasspath()));
addSourceFolder(ijavaproject, arraylist, "src/java");
addSourceFolder(ijavaproject, arraylist, "src/resource");
ijavaproject.setRawClasspath((IClasspathEntry[]) arraylist.toArray(new IClasspathEntry[arraylist.size()]), null);
5.更新透视图
1 IWorkbenchPage iworkbenchpage = PlatformUI.getWorkbench()
2 .getActiveWorkbenchWindow().getActivePage();
3 if (iworkbenchpage.findView("org.eclipse.ui.views.PropertySheet") == null)
4 iworkbenchpage.showView("org.eclipse.ui.views.PropertySheet");
6.显示项目出来
BasicNewResourceWizard.selectAndReveal(iresource, iworkbenchwindow);
原文:http://secyaher.blog.163.com/blog/static/3895577200911493216157/

1091

被折叠的 条评论
为什么被折叠?



