2009-08-21 67 views
15

我有一個eclipse項目,其中每個源文件夾都有自己的關聯輸出文件夾。它被稱爲/ eclipse-classes,而不是/ classes。如何配置用於junit測試的eclipse classpath?

所以,如果我有一個文件夾: 的src/main/java中(典型的Maven的東西) 目標文件夾爲: 目標/月食類

27:11資源等

這似乎工作(即eclipse生成放在這些文件夾內的.class文件),但運行任何Junit測試都會拋出一個異常,指出「找不到類」。我使用內置的eclipse測試運行器運行JUnit(即右鍵單擊類,「以...運行」,「Junit測試」)。

將/ eclipse-classes文件夾複製到/ classes會使它們成功,這意味着eclipse正在使用/ classes,但我找不到任何配置選項來更改它。有什麼方法可以找出eclipse仍然使用/ classes文件夾的地方和原因嗎?

(也許是相關的,我還使用m2eclipse插件)

由Rich賣家的回答啓發一些額外的信息: Maven的配置對資源更改運行以下命令:

process-resources resources:testResources 

雖然這將不會做任何有用的事情(複製到錯誤的目錄中)資源不會有問題,因爲它們最終位於正確的位置。

.classpath條目看起來沒問題。有一堆的Maven子項目所以嵌套去比富發佈更深了一點,但除此之外,它是除了這行如出一轍:

<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/> 

我想我們可能不需要一個,但它不是ATM傷害任何東西。

edit2:進一步測試顯示eclipse在/ eclipse-classes文件夾和/ classes文件夾中都生成類文件。看起來m2eclipse在自動構建時正在後臺運行mvn構建,但似乎無法找到禁用它的方法。如果沒有人提供任何其他想法,我將盡力與m2eclipse開發人員取得聯繫。

+0

你的意思是說,對於源文件夾「服務器」和「客戶端」你會有「服務器類」和「客戶端類」作爲輸出文件夾? – 2009-08-21 13:33:42

+0

你如何啓動JUnit?你使用JUnit Eclipse插件還是從Maven開始單元測試? – Dirk 2009-08-21 13:38:07

+0

我在問題文本中添加了答案。 – wds 2009-08-21 13:41:19

回答

7

如果您使用m2eclipse,那麼Eclipse項目中的配置會被插件覆蓋。有關解決方案,請參閱this article

這樣做的原因是,一些Maven插件不能用的目錄中的target/外面應付,因此m2eclipse的開發者強制文件夾編譯的類是target/classestarget/test-classes,無論你在Eclipse中配置的內容。

通過使用配置文件,可以爲Eclipse使用不同的文件夾。不過,改變maven(及其插件)的輸出文件夾並不明智。

+0

我不這麼認爲,eclipse編譯器正在將類輸出到單獨定義的文件夾中。所以eclipse編譯器正在輸出我的輸出文件夾,這是破壞的運行時類路徑。我不希望Maven負責生成這些.class文件,因爲它可能會中斷增量編譯。 – wds 2009-08-21 13:51:46

+0

另外,上面提到的解決方案似乎適用於配置maven,以便在使用eclipse時把它的.class文件放在其他地方,所以eclipse可以使用target/classes。我正在從另一端接近它我猜:配置日食走出maven的方式。這對我來說似乎更合乎邏輯(不污染項目.pom),但只有當junit插件以某種方式使用構建路徑來創建其運行時類路徑時。 – wds 2009-08-21 13:58:48

+0

這個解決方案解決了從maven-eclipse-plugin到m2eclipse的問題。感謝發佈。 – JamesC 2009-11-18 18:46:08

4

Eclipse JUnit集成沒有特殊的類路徑配置,它將處理在類路徑中定義的輸出文件夾,並且應該找到編譯到這些文件夾的所有類。這可能是因爲你的.classpath文件中有些東西存在缺陷,所以JUnit很困惑(默認情況下,.classpath文件從視圖中隱藏,它位於項目的根目錄中)。

根據你的描述,我期望看到類似下面的條目(注意默認輸出文件夾和src/main/java和src/main/resources的覆蓋)。請問您的類路徑看起來明顯不同,如果是這樣,可能是這個問題

<classpathentry excluding="**" kind="src" output="target/eclipse-classes" path="src/main/resources"/> 
<classpathentry kind="src" output="target/eclipse-classes" path="src/main/java"/> 
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> 
<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/> 
<classpathentry kind="output" path="target/classes"/> 

這是一個長鏡頭,但它也可能是一個Maven乾淨是您的項目配置,如果是這樣的話只要乾淨的目標運行,target/eclipse-classes的內容就會被丟棄,所以在測試運行之前,你的測試將從文件系統中被刪除。您可以通過打開項目屬性(alt-enter)並選擇Maven項目來查看Maven運行的目標。


這部分不直接回答你的問題,但你可能會發現有用。我傾向於將我的Eclipse輸出目錄與Maven相同,並且在Eclipse內部沒有問題(我修改Maven構建器以僅運行過程資源,因此它不會嘗試編譯)。

如果我做了一個Maven構建,Maven編譯器將構建任何更改的類(如果包含乾淨的話,那將是所有更改的類)。 Eclipse中的後續修改由增量式編譯器檢測並處理,一切正常。我確實關閉了Build Automatically,但那只是因爲它讓我很煩惱,如果Maven和Eclipse關閉了它們,它可能就是這樣。

+0

我很確定maven只運行流程資源。我會在星期一嘗試休息並回復你。 – wds 2009-08-22 10:06:33

+0

添加了一些更多的信息,沒有看到任何可以解釋它的東西... – wds 2009-08-24 07:29:43

+0

我爲你的文章+1了,因爲最終我放棄了,並配置maven和eclipse使用相同的輸出文件夾。它偶爾會中斷,但我想它是Good Enough(TM)。 – wds 2010-03-03 15:50:21

1

爲了以防萬一您打算爲此嘗試一個不同的插件:我使用maven-eclipse-plugin來生成我的Eclipse項目設置。我將該插件配置爲將我的Eclipse項目配置爲爲類使用完全獨立的輸出目錄(請參見下文)。它與項目根目錄相關,因此它位於目標之外。

<plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-eclipse-plugin</artifactId> 
     <version>2.6</version> 
     <configuration> 
      <outputDirectory>eclipse_build</outputDirectory> 
     </configuration> 
    </plugin> 

這對我很好,包括能夠通過Maven和Eclipse運行測試。

0

嘗試運行mvn eclipse:eclipse。這爲我解決了這個問題