




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、使用eclipse向?qū)нM(jìn)行快速開(kāi)發(fā)插件入門(mén) 本文將演示如何使用向?qū)О研挛募砑拥揭延?eclipse 項(xiàng)目中。當(dāng)內(nèi)置模板功能不足時(shí),eclipse 向?qū)嵌x可重復(fù)文件類型模板的優(yōu)秀方法。閱讀完本文后,您應(yīng)當(dāng)能夠在 eclipse 中實(shí)現(xiàn)自己的向?qū)б詣?chuàng)建新文件。為了發(fā)揮本文的最大功效,您必須熟悉如何構(gòu)建 java 編程語(yǔ)言類,并且還應(yīng)當(dāng)熟悉繼承和使用接口。您應(yīng)當(dāng)能夠啟動(dòng) eclipse,但是本文假定您并不精通 eclipse。eclipse 向?qū)Ц庞[我喜歡 eclipse ide 的很多特性。其中之一就是可擴(kuò)展性。通過(guò)添加提供功能的插件(包括自動(dòng)創(chuàng)建類、接口、項(xiàng)目、其他資源的向?qū)В?,可以輕松地
2、自定義 ide。此特性對(duì)于大型企業(yè)來(lái)說(shuō)非常重要,在這類企業(yè)中可以基于 eclipse ide 流線化地構(gòu)建和分發(fā)插件,使許多人都可以自動(dòng)利用功能。在任何企業(yè)中,讓團(tuán)隊(duì)以相同的樣式構(gòu)建應(yīng)用程序可以提供許多優(yōu)點(diǎn)。如果應(yīng)用程序是以一致的樣式構(gòu)建的,則應(yīng)用程序?qū)⒏子诰S護(hù)。一致性可以幫助減少錯(cuò)誤。此外,由于應(yīng)用程序是以相同的樣式構(gòu)建的,因此團(tuán)隊(duì)成員可以更輕松地完成一個(gè)又一個(gè)項(xiàng)目。能夠?yàn)?eclipse 框架創(chuàng)建自定義向?qū)蛊髽I(yè)可以構(gòu)建企業(yè)專有的向?qū)?,這些向?qū)⒔o團(tuán)隊(duì)提供使用一致的最佳實(shí)踐創(chuàng)建應(yīng)用程序的機(jī)會(huì)。創(chuàng)建新向?qū)П疚闹袠?gòu)建的自定義向?qū)挥?eclipse 的插件項(xiàng)目中。開(kāi)始創(chuàng)建自定義向?qū)趾?jiǎn)單,
3、這要感謝為您開(kāi)始編寫(xiě)代碼提供前期幫助的其他向?qū)?。在接下?lái)的步驟中,將使用 plug-in project 向?qū)?chuàng)建插件的開(kāi)頭部分。要構(gòu)建新插件項(xiàng)目,請(qǐng)執(zhí)行以下步驟:選擇 file > new > project 以選擇項(xiàng)目向?qū)?。?plug-in development 下選擇 plug-in project,如下所示:?jiǎn)螕?next 前進(jìn)到下一步。圖 1. 選擇插件項(xiàng)目添加項(xiàng)目名稱(在本文中,該名稱為 examplewizard(不是那么有創(chuàng)造性),如圖 2 所示)。如果沒(méi)有特殊原因,請(qǐng)使用默認(rèn)位置。單擊 next。圖 2. 新插件項(xiàng)目在 plug-in version 中輸入版
4、本號(hào),并添加插件名稱和插件提供者的名稱(可能是您,也可能是協(xié)作的團(tuán)隊(duì))。請(qǐng)一定要更新 activator 的包名稱,它默認(rèn)為小寫(xiě)版本的項(xiàng)目名稱。最好使用符合您公司標(biāo)準(zhǔn)的包名稱:例如 com.example.eclipse.wizards。當(dāng)您填寫(xiě)完下圖中所示的信息后,單擊 next。圖 3. 選擇插件項(xiàng)目選擇 custom plug-in wizard,因?yàn)槭褂么诉x項(xiàng)可以讓您對(duì)所包括的組件進(jìn)行微調(diào)。如果您以前從未創(chuàng)建過(guò)新插件項(xiàng)目,那么現(xiàn)在最好看看其他模板的描述以了解可用信息。單擊 next。在 template selection 窗口中,單擊 deselect all 取消選中所有選項(xiàng)。然后
5、,選擇 new file wizard,如下所示。單擊 next。圖 4. 選擇模板e(cuò)clipse 向?qū)⒔o您提示一些關(guān)于正在創(chuàng)建的新向?qū)У男畔ⅲ▍⒁?jiàn)圖 5)。確保更新包名稱,理想情況下將其更新為 activator 所使用的相同名稱 (com.example.eclipse.wizards)。將 wizard category name 更新為新向?qū)募A的名稱。該值的使用方法與 圖 1 中的 plug-in development 類別相同。wizard class name 是從 wizard 繼承的類的 java 類名,該類將實(shí)現(xiàn) inewwizard 接口。wizard page c
6、lass name 將擴(kuò)展 wizardpage 類。圖 5. new wizard options 窗口單擊 finish。eclipse 將給新項(xiàng)目添加必要的類和庫(kù)。雖然還沒(méi)完成,但是已經(jīng)有了很好的開(kāi)端并且準(zhǔn)備好開(kāi)始在向?qū)П澈筇砑右恍?shí)現(xiàn)。wizard 類和 inewwizard 接口現(xiàn)在項(xiàng)目中有三個(gè)類:newxhtmlfilewizard、newxhtmlfilewizardpage 和 activator。下面的部分將處理 newxhtmlfilewizard 類。該類如清單 1 所示,不過(guò)沒(méi)有顯示方法中的所有代碼。清單 1. newxhtmlfilewizard 類public cl
7、ass newxhtmlfilewizard extends wizard implements inewwizard private newxhtmlfilewizardpage page;private iselection selection;public newxhtmlfilewizard() / snipped.public void addpages() / snipped.public boolean performfinish() / snipped.private void dofinish(/ snipped.private inputstream opencontent
8、stream() / snipped.private void throwcoreexception(string message) throws coreexception / snipped.public void init(iworkbench workbench, istructuredselection selection) / snipped.實(shí)現(xiàn) inewwizard 接口必須使用最后一個(gè)方法 init()。接下來(lái),本文將介紹此方法以及此模板中自動(dòng)包括的其余方法。addpages() 方法addpages() 方法將把頁(yè)面添加到向?qū)е小G鍐?2 中所示的方法將把單個(gè)頁(yè)面添加到向?qū)?/p>
9、 newxhtmlfilewizardpage 中。清單 2. addpages() 方法將把頁(yè)面添加到向?qū)е?* * adding the page to the wizard. */public void addpages() page = new newxhtmlfilewizardpage(selection);/ you can add more pages here.addpage(page);newxhtmlfilewizardpage 類包含為用戶提供指定頁(yè)面名稱功能的控件。您可以稍后把控件添加到頁(yè)面中,使最終用戶可以輸入更多信息。performfinish() 方法當(dāng)用戶單擊
10、向?qū)е械?finish 按鈕時(shí)將調(diào)用 performfinish() 方法。在執(zhí)行一些檢查之后,它將使用 irunnablewithprogress 接口調(diào)用 dofinish() 方法。使用此接口意味著在執(zhí)行 dofinish() 方法時(shí)(在本例中需要花很長(zhǎng)時(shí)間運(yùn)行)不必編寫(xiě)顯示進(jìn)度條的所有 ui 元素。下面完整地列出了該方法。清單 3. performfinish() 方法/* * this method is called when 'finish' button is pressed in * the wizard. we will create an operatio
11、n and run it * using wizard as execution context. */public boolean performfinish() final string containername = page.getcontainername();final string filename = page.getfilename();irunnablewithprogress op = new irunnablewithprogress() public void run(iprogressmonitor monitor) throws invocationtargete
12、xception try dofinish(containername, filename, monitor); catch (coreexception e) throw new invocationtargetexception(e); finally monitor.done();try getcontainer().run(true, false, op); catch (interruptedexception e) return false; catch (invocationtargetexception e) throwable realexception = e.gettar
13、getexception();messagedialog.openerror(getshell(), "error", realexception.getmessage();return false;return true;dofinish() 方法 如下所示,dofinish() 方法將創(chuàng)建新文件并通過(guò) ide 中的編輯器打開(kāi)新文件。將調(diào)用 opencontentstream() 方法以獲得給新文件填充內(nèi)容的輸入流。清單 4. 初始的 dofinish() 方法/* * the worker method. it will find the container, crea
14、te the * file if missing or just replace its contents, and open * the editor on the newly created file. */private void dofinish(string containername,string filename,iprogressmonitor monitor)throws coreexception / create a sample filemonitor.begintask("creating " + filename, 2);iworkspacero
15、ot root = resourcesplugin.getworkspace().getroot();iresource resource = root.findmember(new path(containername);if (!resource.exists() | !(resource instanceof icontainer) throwcoreexception("container "" + containername + "" does not exist.");icontainer container = (ico
16、ntainer) resource;final ifile file = container.getfile(new path(filename);try inputstream stream = opencontentstream();if (file.exists() file.setcontents(stream, true, true, monitor); else file.create(stream, true, monitor);stream.close(); catch (ioexception e) monitor.worked(1);monitor.settaskname(
17、"opening file for editing.");getshell().getdisplay().asyncexec(new runnable() public void run() iworkbenchpage page =platformui.getworkbench().getactiveworkbenchwindow().getactivepage();try ide.openeditor(page, file, true); catch (partinitexception e) );monitor.worked(1);opencontentstream(
18、) 方法如下所示,opencontentstream() 方法將返回包含生成的靜態(tài)字符串作為模板一部分的 bytearrayinputstream。對(duì)于本文,字符串將被替換為模板文件的內(nèi)容。此方法中的代碼是首先必須更改的,這樣才能在創(chuàng)建時(shí)允許把更多有用的內(nèi)容添加到新文件中。清單 5. opencontentstream() 方法/* * initialize file contents with a sample text. */private inputstream opencontentstream() string contents ="this is the initial
19、file contents for *.html " +"file that should be word-sorted in the preview " +"page of the multi-page editor"return new bytearrayinputstream(contents.getbytes();添加基本內(nèi)容新文件的內(nèi)容不使用靜態(tài)字符串值,您可以使用 getresourceasstream() 方法把文件的內(nèi)容載入到 inputstream 中,并且 dofinish() 方法可以用它來(lái)填充新文件。請(qǐng)做出如下所示的修改
20、。清單 6. 從資源獲得輸入流/* * initialize the file contents to contents of the * given resource. */private inputstream opencontentstream() return this.getclass().getresourceasstream("templates/index-xhtml-template.resource");index-xhtml-template.resource 文件中是有效的可擴(kuò)展超文本標(biāo)記語(yǔ)言(extensible hypertext markup
21、language,xhtml)v1.0 strict web 頁(yè)面。它有針對(duì)一組模擬企業(yè)樣式表和 javascript 文件的一些基本標(biāo)記和點(diǎn)。該文件列于清單 7 中。此文件與 newxhtmlfilewizard 類在同一個(gè)包中,因此在本文中此文件位于 com.example.eclipse.wizards 包中。如果需要將文件放在其他包中,則可以像訪問(wèn)目錄內(nèi)的文件一樣訪問(wèn)它(即,com.example.resources 是 /com/example/resources)。清單 7. index-xhtml-template.resource 文件<!doctype html pub
22、lic "-/w3c/dtd xhtml 1.0 strict/en" "/tr/xhtml1/dtd/xhtml1-strict.dtd"><html xmlns="/1999/xhtml"><head><title>this is an e web page</title><link rel="stylesheet" href=" type="text/css"
23、; /><script type="text/javascript" language="javascript" src="</script></head><body><div id="search"><form id="searchform" name="searchform" action="<input type="text" name="searchtext"
24、; /> <input type="button"value="search e" /></form></div><div id="mainmenu"><p class="menu">main menu</p><ul class="mainmenu"><li><a href="<li><a href=" 1</a></li>&l
25、t;/ul></div><!- put the body of your page here -><div id="body"></div></body></html>現(xiàn)在,您可以運(yùn)行 eclipse 插件來(lái)查看該插件的內(nèi)容。測(cè)試新向?qū)г?eclipse 創(chuàng)建向?qū)褂玫娜齻€(gè)類之后,您可以在閱讀本文的過(guò)程中隨時(shí)啟動(dòng)另一個(gè) eclipse 實(shí)例來(lái)運(yùn)行和測(cè)試插件。要啟動(dòng)插件項(xiàng)目,請(qǐng)?jiān)陧?xiàng)目上右擊,并選擇 run as > eclipse application,如圖 6 所示。eclipse 的新
26、實(shí)例將啟動(dòng)。圖 6. 將項(xiàng)目作為 eclipse 應(yīng)用程序來(lái)運(yùn)行現(xiàn)在需要?jiǎng)?chuàng)建包含新文件的臨時(shí)項(xiàng)目。項(xiàng)目的名稱無(wú)關(guān)緊要 諸如 “temp” 之類的名稱即可。當(dāng)新項(xiàng)目已在工作區(qū)中后,請(qǐng)通過(guò)選擇 file > new > other 來(lái)添加新模板。如果一切按預(yù)期運(yùn)行正常,則新類別將列于您為向?qū)Фx的類別下的 select a wizard 窗口中。我使用了 e 企業(yè)模板,如下所示:圖 7. 使用新模板當(dāng)您完成向?qū)У钠溆嗖糠趾?,eclipse 將創(chuàng)建包含定義內(nèi)容的新文件。如果此簡(jiǎn)單功能就是模板所需的全部功能,則可以止于此處。但是,可能還需要提示用戶提供一些用來(lái)整合文件內(nèi)容的輸入。自定義向?qū)?/p>
27、頁(yè)面初始 newxhtmlfilewizardpage 的表單中只有兩個(gè)控件:一個(gè)用于容器(項(xiàng)目或文件夾)的名稱,而另一個(gè)用于創(chuàng)建新文件時(shí)使用的名稱。createcontrol() 方法(完整的方法代碼如清單 8 所示)負(fù)責(zé)創(chuàng)建這些控件和將其添加到對(duì)話框中。清單 8. createcontrol() 方法/* * see idialogpage#createcontrol(composite) */public void createcontrol(composite parent) composite container = new composite(parent, swt.null);g
28、ridlayout layout = new gridlayout();container.setlayout(layout);layout.numcolumns = 3;layout.verticalspacing = 9;label label = new label(container, swt.null);label.settext("&container:");containertext = new text(container, swt.border | swt.single);griddata gd = new griddata(griddata.fi
29、ll_horizontal);containertext.setlayoutdata(gd);containertext.addmodifylistener(new modifylistener() public void modifytext(modifyevent e) dialogchanged(););button button = new button(container, swt.push);button.settext("browse.");button.addselectionlistener(new selectionadapter() public vo
30、id widgetselected(selectionevent e) handlebrowse(););label = new label(container, swt.null);label.settext("&file name:");filetext = new text(container, swt.border | swt.single);gd = new griddata(griddata.fill_horizontal);filetext.setlayoutdata(gd);filetext.addmodifylistener(new modifyl
31、istener() public void modifytext(modifyevent e) dialogchanged(););initialize();dialogchanged();setcontrol(container);必須先在文件的頂部聲明新控件和其他控件,然后才可以將新控件添加到此方法中。 清單 9. 聲明新控件public class newxhtmlfilewizardpage extends wizardpage /* newly added for the page title */private text titletext;/ the rest of the cl
32、ass.現(xiàn)在添加文本的 getter。newxhtmlfilewizard 類將在構(gòu)建新文件時(shí)使用此 getter。gettitle() 方法如下所示:清單 10. gettitle() 方法/* * gets the html title for the new file */public string gettitle() return titletext.gettext();修改 createcontrol() 方法以添加標(biāo)題的新輸入控件和標(biāo)簽。新代碼如下所示:清單 11. 修改后的 createcontrol() 方法/* * see idialogpage#createcontrol
33、(composite) */public void createcontrol(composite parent) composite container = new composite(parent, swt.null);gridlayout layout = new gridlayout();container.setlayout(layout);layout.numcolumns = 3;layout.verticalspacing = 9;label label = new label(container, swt.null);label.settext("&cont
34、ainer:");containertext = new text(container, swt.border | swt.single);griddata gd = new griddata(griddata.fill_horizontal);containertext.setlayoutdata(gd);containertext.addmodifylistener(new modifylistener() public void modifytext(modifyevent e) dialogchanged(););button button = new button(cont
35、ainer, swt.push);button.settext("browse.");button.addselectionlistener(new selectionadapter() public void widgetselected(selectionevent e) handlebrowse(););label = new label(container, swt.null);label.settext("&file name:");filetext = new text(container, swt.border | swt.sing
36、le);gd = new griddata(griddata.fill_horizontal);filetext.setlayoutdata(gd);filetext.addmodifylistener(new modifylistener() public void modifytext(modifyevent e) dialogchanged(););/* need to add empty label so the next two controls * are pushed to the next line in the grid. */label = new label(contai
37、ner, swt.null);label.settext("");/* adding the custom control here */label = new label(container, swt.null);label.settext("&title:");titletext = new text(container, swt.border | swt.single);gd = new griddata(griddata.fill_horizontal);titletext.setlayoutdata(gd);titletext.addm
38、odifylistener(new modifylistener() public void modifytext(modifyevent e) dialogchanged(););/* finished adding the custom control */initialize();dialogchanged();setcontrol(container);在將代碼添加到 newxhtmlfilewizard 類中之前,請(qǐng)通過(guò)執(zhí)行先前概述的步驟測(cè)試到目前為止的更改。驗(yàn)證用戶輸入用戶在新向?qū)У?title 字段中輸入的文本將用作新 html 文件的 <title> 元素中的文本。
39、出于本文的目的,該值是必需的,因此需要添加檢查輸入的代碼以確保用戶輸入的內(nèi)容是沒(méi)有問(wèn)題的。對(duì) dialogchanged() 方法的修改如下所示:清單 12. 檢驗(yàn) dialogchanged() 中的輸入/* * ensures that both text fields are set. */private void dialogchanged() iresource container = resourcesplugin.getworkspace().getroot().findmember(new path(getcontainername();string filename = ge
40、tfilename(); string titletext = gettitle();if (getcontainername().length() = 0) updatestatus("file container must be specified");return;if (container = null| (container.gettype() & (iresource.project | iresource.folder) = 0) updatestatus("file container must exist");return;if
41、 (!container.isaccessible() updatestatus("project must be writable");return;if (filename.length() = 0) updatestatus("file name must be specified");return;if (filename.replace('', '/').indexof('/', 1) > 0) updatestatus("file name must be valid"
42、);return;int dotloc = filename.lastindexof('.');if (dotloc != -1) string ext = filename.substring(dotloc + 1);if (ext.equalsignorecase("html") = false) updatestatus("file extension must be "html"");return; if (titletext.length() =0 )updatestatus("title must
43、 be specified");return;updatestatus(null);完成這些更改后,如果不輸入 title 值,向?qū)⑻峁╁e(cuò)誤消息。此外,finish 按鈕將被禁用,直至為 title 指定了值為止。通過(guò)使用先前概述的步驟運(yùn)行插件項(xiàng)目來(lái)檢驗(yàn)此功能。添加自定義內(nèi)容向?qū)ы?yè)面 newxhtmlfilewizardpage 現(xiàn)在將捕捉用戶輸入的 html 標(biāo)題的值,但是它尚未把該值合并到文件中。要開(kāi)始將該值添加到文件中,首先需要編輯 index-xhtml-template.resource 文件使其包含該值的占位符。您可以將 <title> 元素更改為 <
44、title>$title</title>,這樣可以更輕松地包含占位符。修改 performfinish() 方法以從向?qū)ы?yè)面獲得標(biāo)題并將標(biāo)題傳遞給 dofinish() 方法以及其余值。清單 13. 最終的 performfinish() 方法/* * this method is called when 'finish' button is pressed in the wizard. we * will create an operation and run it using wizard as execution context. */public bo
45、olean performfinish() final string containername = page.getcontainername();final string filename = page.getfilename();final string title = page.gettitle();irunnablewithprogress op = new irunnablewithprogress() public void run(iprogressmonitor monitor)throws invocationtargetexception try dofinish(con
46、tainername, filename, title, monitor); catch (coreexception e) throw new invocationtargetexception(e); finally monitor.done();try getcontainer().run(true, false, op); catch (interruptedexception e) return false; catch (invocationtargetexception e) throwable realexception = e.gettargetexception();mes
47、sagedialog.openerror(getshell(), "error", realexception.getmessage();return false;return true;接下來(lái),略微修改 dofinish() 方法使其接受標(biāo)題作為參數(shù)并將其傳遞給 opencontentstream() 方法。清單 14. 接受標(biāo)題作為參數(shù)的最終 dofinish() 方法/* * the worker method. it will find the container, create the file if missing * or just replace its c
48、ontents, and open the editor on the newly created * file. */private void dofinish(string containername, string filename, string title,iprogressmonitor monitor) throws coreexception monitor.begintask("creating " + filename, 2);iworkspaceroot root = resourcesplugin.getworkspace().getroot();i
49、resource resource = root.findmember(new path(containername);if (!resource.exists() | !(resource instanceof icontainer) throwcoreexception("container "" + containername+ "" does not exist.");icontainer container = (icontainer) resource;final ifile file = container.getfil
50、e(new path(filename);try inputstream stream = opencontentstream(title);try if (file.exists() file.setcontents(stream, true, true, monitor); else file.create(stream, true, monitor); finally stream.close(); catch (ioexception e) monitor.worked(1);monitor.settaskname("opening file for editing.&quo
51、t;);getshell().getdisplay().asyncexec(new runnable() public void run() iworkbenchpage page = platformui.getworkbench().getactiveworkbenchwindow().getactivepage();try ide.openeditor(page, file, true); catch (partinitexception e) );monitor.worked(1);最后,需要修改 opencontentstream() 方法的很大一部分才能夠?qū)⑽募械?$title
52、值替換為用戶提供的值(參見(jiàn)清單 15)。在配有大量不同值的模板中,您可以使用更精確的解決方案,例如擴(kuò)展 filterinputstream 并替換一整組不同值的新類。 清單 15. 最終的 opencontentstream() 方法/* * initialize the file contents to contents of the given resource. */private inputstream opencontentstream(string title)throws coreexception final string newline = "" / syste
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年入股合同模板
- 2025年農(nóng)業(yè)技術(shù)創(chuàng)新成果轉(zhuǎn)讓許可合同范文
- 2025年新版幼兒園食品安全管理合同
- 2025年全球貨物交易合同標(biāo)準(zhǔn)文本
- 工程施工勞動(dòng)合同合同樣本
- 2025年化工原料采購(gòu)合同標(biāo)準(zhǔn)版
- 2025年不銹鋼平板購(gòu)銷合同
- 【正版授權(quán)】 ISO/TS 6892-5:2025 EN Metallic materials - Tensile testing - Part 5: Specification for testing miniaturised test pieces
- 單位租賃合同范本
- 【正版授權(quán)】 ISO/TR 11954:2024 EN Fuel cell road vehicles - Performance measurement - Vehicles fuelled with compressed hydrogen
- 五年級(jí)數(shù)學(xué)(小數(shù)乘除法)計(jì)算題專項(xiàng)練習(xí)及答案匯編
- 上海市楊浦區(qū)2024-2025學(xué)年八年級(jí)上學(xué)期英語(yǔ)期末考卷(含筆試答案無(wú)聽(tīng)力答案、原文及音頻)
- 課題申報(bào)參考:法國(guó)漢學(xué)家弗朗索瓦·朱利安對(duì)中國(guó)山水畫(huà)論的闡釋研究
- 生物-山東省濰坊市、臨沂市2024-2025學(xué)年度2025屆高三上學(xué)期期末質(zhì)量檢測(cè)試題和答案
- 2024年09月2024年中國(guó)農(nóng)業(yè)發(fā)展銀行總行部門(mén)秋季校園招聘(22人)筆試歷年參考題庫(kù)附帶答案詳解
- 2025年小學(xué)督導(dǎo)工作計(jì)劃
- 2024-2025學(xué)年部編版歷史九年級(jí)上冊(cè)期末復(fù)習(xí)練習(xí)題(含答案)
- 2025年北京生命科技研究院招聘筆試參考題庫(kù)含答案解析
- 銀行金融機(jī)構(gòu)銀行金融服務(wù)協(xié)議
- 基于ChatGPT的ESG評(píng)級(jí)體系實(shí)現(xiàn)機(jī)制研究
- 2024年長(zhǎng)沙民政職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)及答案解析
評(píng)論
0/150
提交評(píng)論