2013-01-14 59 views
1

我將把它分成兩個問題,以儘可能簡潔。前一段時間,我開始爲教育目的而編寫文本編輯器,並且一直在這裏和那裏添加它。一路走來,我決定讓它編譯並運行java程序。我使用JavaCompiler類進行編譯,並使用一個簡單的exec()方法來執行命令以在控制檯中運行程序。源代碼已經變成了混亂的混亂,可能是因爲它是用無組織的塊編寫的,所以我最近決定重寫它。在重寫程序的同時,我在文本區下方添加了一個控制檯窗口,以顯示編譯器的控制檯輸出以及運行時拋出的任何異常等。以編程方式使用java源文件和類文件

寫入代碼時顯示JavaCompiler的輸出或通過一個BufferedInputStream控制檯輸出我意識到我正在做這兩件事,我一直認爲這兩件事情在很大程度上是相似的。我的第一個問題大多隻是詢問你的意見,我不知道Java中的一個類會像一個簡單的IDE那樣運行Java程序,所以執行一個控制檯命令是我知道這樣做的唯一方法,同樣可以完成使用javac命令編譯代碼,我很好奇使用JavaCompiler類是否有任何優勢?

最後,我一直在爲這件事添加一些簡潔的功能。我希望能夠跟蹤和組織Java項目,因爲我正在編譯和運行Java程序。我想能夠告訴任何給定文件屬於哪個項目,並且能夠分辨項目中的包和目錄之間的區別,以便我可以查看包文件夾以編譯源文件並執行正確的運行命令從二進制文件夾運行它,是否提供了一種方法來做到這一點,或者我將不得不做一些事情,比如創建自定義的類,它們從文件繼承,但有額外的字段來確定文件類型(目錄或包)?還是有更好的方法來實現這一點?

謝謝你的時間。

+0

對於最後一個問題,現代IDE通過讓開發人員指定哪個目錄是源目錄的根目錄(如src或src/main/java)來解決此問題。 – Brian

+0

嗯,這是尷尬,我不知道當我打字時我在想什麼...我打算詢問有關存儲目錄和文件的位置,包括會話之間的位置。我知道它必須是某種屬性文件,可能是XML?我從來沒有見過這樣的屬性文件,它似乎就像每個項目的XML文件,因爲我建議如果不小心,可能會變得雜亂無章並且佔用一部分用戶文件系統。如果用戶打開保存的文件,我希望整個項目加載到屏幕左側的JList或JTree中以進行特定處理。什麼是最好的方式來做到這一點? –

+0

我已經發布了一些建議和想法的答案。 – Brian

回答

1

你有兩個問題需要齊頭並進。讓我們從元數據開始。瞭解如何跟蹤IDE的項目元數據的最佳方法是查看已建立的項目如何嘗試去做。

Eclipse和Netbeans都使用項目根目錄中創建的項目文件夾來保存元數據(Eclipse中的.settings,Netbeans中的.nbproject)。源數據文件,編譯器目標目錄,源代碼等元數據保存在元數據文件中,主要是XML。

您可能會想要遵循類似的內容,然後考慮添加常見項目原型,如/src/classes/src/main/java/target。這導致您的問題的第二部分,編譯。

Netbeans本身並不直接使用編譯器。 Eclipse的確如此,但這是因爲Eclipse有其自己的內部編譯器實現來提供額外的警告和配置,這在默認編譯器中是不可用的。對於你的IDE,我會看看Netbeans如何管理它的項目並編譯它們。 Netbeans使用Ant和內部文件build.xml而不是調用javac。如果您對Ant不熟悉,它只是一個工具,它允許您設置可由Ant解釋和運行的XML任務。例如,您可以使用Ant編譯Java源代碼,生成文檔並創建分發JAR。這是一個非常強大的工具,可以讓您將整個構建過程自動化爲一種腳本。

你可以遵循這個相同的想法。您的IDE中的新項目將具有默認的build.xml文件,該文件將使用一些默認的Ant目標構建其項目。您也可以從build.xml中訪問屬性文件,以便您可以將有關源目錄的信息以及您想在構建腳本中使用的任何其他可定製信息存儲在屬性文件中,並將其導入構建腳本中。這是一個示例設置。

文件結構:

| Project root/ 
| .myideproject/ 
|  build.xml 
|  project.properties 
|  ui.properties 
| classes/ 
|  <compiled .class files> 
| doc/ 
|  <generated javadoc files> 
| lib/ 
|  <3rd-party .jar files needed for compilation> 
| src/ 
|  <user .java files> 

build.xml文件是什麼使用你的IDE編譯的事情。你可以要求用戶安裝Ant(一個快速和無痛的過程),或者你可以像Netbeans那樣捆綁它(更適合你)。在這兩種情況下,如果你嵌套你build.xml.myideproject目錄內,您的構建文件將是這樣的:

<project name="<User's project name>" default="compile" basedir=".."> 
    <!-- ... --> 
</project> 

注意兩兩件事:

  1. 「用戶的項目名稱」由用戶提供當他們創建項目時。
  2. 「default」屬性將指向構建文件中的目標。
  3. 「basedir」屬性將重新構建構建過程,以便它指向項目根目錄,而不是.myideproject

接下來你需要導入project.properties文件(ui.properties是爲您節省UI相關的數據,而不是用於構建腳本,project.properties包含一切的構建腳本需要正常運行)。這是你如何導入屬性到您的Ant項目:

<project ... > 
    <import file=".myideproject/project.properties" /> 
    <!-- ... --> 
</project> 

這將使所有在project.properties可使用指令${propname}屬性。現在,srcclasses是在project.properties文件配置的目錄,我們可以在我們compile目標使用它們,就像這樣:

<target name="compile"> 
    <javac srcdir="${src}" 
     destdir="${target}" 
     classpath="${classpath}" 
     source="${src.jdk}" 
     target="${target.jdk}" 
     debug="on" 
     debugLevel="lines,vars,source" /> 
</target> 

對於上述目標中,屬性文件可能是這個樣子:

# delimits source directories containing .java files using ':' 
src=src1:src2 
# only 1 directory, it's where the .class files go 
target=classes 
# ':'-delimited list of jars or globs which are needed for compilation 
classpath=lib/* 
# Determines the -source value on the javac process 
src.jdk=1.6 
# Determines the -target value on the javac process 
target.jdk=1.6 

評論只是爲了清楚。此屬性文件將使用用戶輸入從IDE的UI中構建,因此如果他們添加或刪除源文件夾,則屬性文件中的值src會自動更改,然後他們可以重建該過程。

這應該足以讓你開始。有些事情要考慮:

  • 你會需要使用該java任務由IDE設置屬性來告訴它一起使用的主要方法,類run目標。
  • 您可能還想考慮對Maven項目的支持,以幫助用戶自動解決依賴關係。這對你來說可能會更好,你應該等待,直到你完成了對Ant的支持。
  • 你需要將Ant進程中的standard-out/err/in重定向到用戶可以與之交互的東西。你不必支持標準的,但根據您的評論你至少應該支持標準輸出/犯錯

最後一句話:你要使用JTree與擴展DefaultMutableTreeNode定製節點類創建視圖,但它並不必須是文件結構這麼多隻是一個項目的視點的視點,所以也許它可能是這樣的:

+ Project 1 Name 
| + Source Folder 1 
|  <.java files> 
| + Source Folder 2 
|  <.java files> 
| + Source Folder 3 
|  <.java files> 
+ Project 2 Name 
| + Source Folder 1 
|  <.java files> 
| + Source Folder 2 
|  <.java files> 
| + Source Folder 3 
|  <.java files> 

結構可以根據在文件系統上,但只顯示用戶需要的信息,如他的源目錄。你可以從那裏擴展這個想法。

祝你好運,聽起來像一個有趣的項目。希望我的建議能夠幫助你。讓我知道是否需要澄清。

+0

謝謝,首先我要看看Ant。我意識到這一點,但我從未使用它。我也將不得不決定用一個庫來創建和讀取XML文件。如果我有任何問題,我一定會通知你。謝謝,這是非常豐富的:-)。 –

+0

對於XML文件,有很多選項。我通常編寫一個XSD文件,然後使用XSD與XJC和JAXB編組/解組XML。你可以[從這裏開始](http://jaxb.java.net/2.2.6/docs/ch01.html),網上有很多資源可以用來學習如何使用它。很高興我能幫上忙。 :) – Brian