2010-05-16 39 views
4

我使用Maven構建項目並編譯失敗了,因爲我把Test.javaTest2類className必須在className.java中編碼嗎?

,但由於它的Maven或僅僅是因爲Java本身不支持呢?

順便說一句,我怎樣才能用eclipse打開maven項目?

+0

不知道Maven,但類名應該與編譯單元(^ .java)匹配,否則這將導致失敗。 – 2010-05-16 11:03:11

+0

另外,班級名稱應以大寫字母開頭。 – Kobi 2010-05-16 11:04:58

+1

請一次只問一個問題。 – tangens 2010-05-16 11:05:08

回答

6

一個public類稱爲ClassName必須(在大多數情況下)在一個文件中定義了一個名爲ClassName.java

編輯

雖然這不是Java語言的要求,大部分(如果不是全部)的Java實現,類名和文件名之間的上述關係必須持有,或編譯器錯誤將導致。

(有關詳細信息,請參閱Jon Skeet's answer。)

其原因可以通過讀取的The Java Language Specification, Third EditionSection 7.2: Packages被發現。

在本節中,它描述瞭如何將目錄結構映射到Java中的fully-qualified class name,這導致包含類的字節碼的.class文件必須駐留在類似於完全合格的課程名稱。

錯誤地表明命名方案是一項要求的原始答案已被編輯。

2

Java要求您將公用類放在具有相同名稱的文件中。

用於eclipse和maven使用sonatype m2插件。裏面你的Maven項目,你可以再鍵入

mvn eclipse:eclipse 

和Maven將創建一個.project.classpath文件給你。這些是日食需要與項目一起工作的文件。

您必須使用本地maven存儲庫的路徑定義eclipse classpath變量M2_REPO

隨着Sonatype的M2你可以從Eclipse中做行家的事情:添加依賴,運行Maven目標,...

+0

m2eclipse插件與maven-eclipse-plugin沒有任何關係。如果你使用前者,你不必運行'mvn eclipse:eclipse'。如果你使用後者,你不必使用m2eclipse。 – 2010-05-16 11:10:44

+0

似乎我可以直接運行'mvn eclipse:eclipse'而不需要安裝sonatype me插件? – httpinterpret 2010-05-16 11:11:20

+0

@ pascal-thivent:是的,你是完全正確的。我加了m2,因爲它在eclipse中使事情變得更容易。但我錯過了說這是兩個截然不同的話題。 – tangens 2010-05-16 11:13:31

0

我使用Maven構建項目並編譯失敗了,因爲我把類的Test2在Test.java,

源文件必須在公共類它們包含的名字命名,追加後綴.java。在你的情況下,公共類Test2的源文件必須是Test2.java

是因爲maven還是因爲java本身不支持這個?

Java編譯器javac抱怨,而不是Maven(Maven不會改變編譯器的行爲)。

我該如何使用eclipse打開maven項目?

要麼使用Maven Eclipse Plugin(Maven的即插件),只是對項目運行的mvn eclipse:eclipse然後導入...它作爲現有項目到工作區在Eclipse。您將需要設置一個指向本地存儲庫的類路徑變量M2_REPO來使用它。查看Usage頁面瞭解詳情。

或(和這是一個獨家或)安裝m2eclipse(即Eclipse的插件,擴展它,使其能夠了解一個Maven項目,並與它在一個雙向的方式進行交互)和進口..您的項目爲現有Maven項目

如果EXCLUSIVE不夠清楚,這意味着:使用一個另一個,但不是在同一時間。

正如Jon Skeet所述,JLS 允許這個基於文件的實現的限制。這不適用於使用數據庫來存儲Java構造(如Visual Age for Java所做的那樣)。但就你而言,它確實如此。

+0

我不認爲m2eclipse可以工作,因爲在生成的'.project'中有這樣的註釋。 – httpinterpret 2010-05-16 11:51:33

+0

' NO_M2ECLIPSE_SUPPORT:在M2Eclipse中不支持使用maven-eclipse-plugin創建的項目文件。' – httpinterpret 2010-05-16 11:55:21

+0

@httpinterpret我明確地寫道,他們是獨佔的,你使用一個或另一個,而不是在同一時間。我不能更清楚,只是仔細閱讀。 – 2010-05-16 11:56:57

6

Java語言規範本身並不實際要求這 - 但它明確允許基於文件系統的實現這樣做,而且大多數情況下。

section 7.6

當包存儲在文件系統 (第7.2.1節),主系統可以 選擇強制執行 是,如果一個編譯時錯誤的限制型 未在文件下類型名稱組成名稱 加上 擴展實測值(如的.java或.jav)如果 下面的任一爲真:

  • 該類型由 其他類型的聲明包 的編譯單元中的代碼引用。
  • 類型聲明爲public(因此 可能從 其他程序包中的代碼訪問)。

此限制 意味着必須有在每編譯單元最多一個 這樣類型。這種限制使得 編譯器可以很容易地使用Java編程 語言或者使用 Java虛擬機的實現在包中找到一個名爲 的類;例如, 爲公共 類型wet.sprocket.Toad源代碼將在 文件Toad.java在目錄 溼/鏈輪發現,對應的 對象代碼將在文件 蟾蜍找到。班級在同一個目錄中。

當軟件包存儲在數據庫 (第7.2.2節)中時,主機系統不允許 施加此類限制。在實踐中,許多程序員選擇將每個 類或接口類型放入其自己的 編譯單元中,而不管它是否爲 public或由其他編譯單元中的代碼引用 。

對於實際的目的我認爲這是合理的,基本上認爲它是必需的。

0

文件名和類名之間的連接如下:

  • ,如果你在一個文件中有public class,文件名必須是相同的類名
  • 你可以有許多非你想在不同名稱的文件中使用公共類
相關問題