2015-11-26 71 views
1

找到類我有這個POM一個小項目...Maven的測試編譯不會在類路徑

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.example.shipcloud</groupId> 
    <artifactId>shipcloud-api</artifactId> 
    <description>The Java API for ShipCloud.</description> 
    <version>1.0-SNAPSHOT</version> 
    <prerequisites> 
     <maven>3.0</maven> 
    </prerequisites> 
    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <project.compiler.source.version>1.8</project.compiler.source.version> 
     <project.compiler.target.version>1.8</project.compiler.target.version> 
    </properties> 
    <dependencies> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-web</artifactId> 
      <version>4.2.0.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-databind</artifactId> 
      <version>2.6.3</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.commons</groupId> 
      <artifactId>commons-lang3</artifactId> 
      <version>3.4</version> 
     </dependency> 
     <dependency> 
      <groupId>commons-io</groupId> 
      <artifactId>commons-io</artifactId> 
      <version>2.4</version> 
     </dependency> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.12</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <!-- More Matchers than the default version in JUnit --> 
      <groupId>org.hamcrest</groupId> 
      <artifactId>hamcrest-all</artifactId> 
      <version>1.3</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-test</artifactId> 
      <version>4.2.0.RELEASE</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.assertj</groupId> 
      <artifactId>assertj-core</artifactId> 
      <version>2.2.0</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>com.jayway.jsonpath</groupId> 
      <artifactId>json-path</artifactId> 
      <version>2.0.0</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

在Eclipse中,一切工作正常,測試工作(使用類Maven在無法找到),但是當我試圖清理通過Maven的安裝,我得到一個錯誤,它不能在此行中找到AssertJ)的AbstractCharSequenceAssert(部分(即低於另一個公共類的類):

class UrlParameterStringAssert extends AbstractCharSequenceAssert<UrlParameterStringAssert, String> { 

INFO] ------------------------------------------------------------- [ERROR] COMPILATION ERROR :
[INFO] ------------------------------------------------------------ [ERROR] /home/fschaetz/workspaces/workspace5/.../shipcloud-api/src/test/java/com/example/shipcloud/rest/shipcloud/domain/AddressSearchFieldsTest.java:[103,39] error: cannot find symbol [ERROR] symbol: class AbstractCharSequenceAssert

我有looke通過調試輸出d和運行testCompile時,該AssertJ罐子實際上是向編譯器類路徑:

-classpath ...:/home/fschaetz/.m2/repository/org/assertj/assertj-core/2.2.0/assertj-core-2.2.0.jar:...

(該文件存在,是可讀的,包含類和在Eclipse中正常工作)。

我試過乾淨(maven/eclipse),在項目上運行更新等,但似乎沒有任何工作。當我嘗試在jenkins中運行maven install時,發生同樣的事情,順便說一句。

,使麻煩是類的進口...

import static de.assona.rest.shipcloud.domain.UrlParameterStringAssert.assertThat; 

import java.util.Arrays; 
import java.util.HashSet; 
import java.util.Set; 

import org.assertj.core.api.AbstractCharSequenceAssert; 
import org.junit.Before; 
import org.junit.Test; 

任何想法?

+0

你可以發佈類AddressSearchFieldsTest的導入嗎? – Tunaki

+0

UrlParameterStringAssert是你自己的類還是由AssertJ提供? –

+0

我的。我擴展了'AbstractCharSequenceAssert'來做我自己的一些斷言魔術。 –

回答

0

老實說,我不知道爲什麼的問題是,它是什麼(會很高興對任何人解釋),但什麼是WAS的是,這兩個類都在同一個文件中定義...

public class AddressSearchFieldsTest { 

... some testing ... 

} 

class UrlParameterStringAssert extends AbstractCharSequenceAssert<UrlParameterStringAssert, String> { 

... a custom Assertion class... 

} 

通常情況下,我不會指望類似這樣的麻煩(因爲在同一個文件中聲明非公共類應該沒有問題),但不知何故,maven不喜歡它。將UrlParameterStringAssert移至其自己的文件解決了問題。想知道爲什麼。

+0

看看我的回答。似乎你應該更深入地瞭解你的Maven設置並檢查調試輸出。 – SubOptimal

0

對我來說,你有一個奇怪的設置莫名其妙。

假設我們有如下結構

src\main\java\Foo.java            
src\test\java\sub\optimal\mavenexample\AddressSearchFieldsTest.java 

Foo.java

class Foo { } 

AddressSearchFieldsTest。使用pom.xml以下目標的Java

import org.assertj.core.api.AbstractCharSequenceAssert; 
public class AddressSearchFieldsTest { } 

class UrlParameterStringAssert extends 
    AbstractCharSequenceAssert<UrlParameterStringAssert, String> { 
    UrlParameterStringAssert(String s) { 
     super(s, UrlParameterStringAssert.class); 
    } 
} 

mvn clean compile

# from the log output 
maven-compiler-plugin:2.3.2:compile (default-compile) 

執行併產生下面的類文件

target\classes\Foo.class 

目標default-testCompile(你提到),例如執行通過mvn clean compile test

# from the log output 
maven-compiler-plugin:2.3.2:testCompile (default-testCompile) 

,併產生以下的類文件

target\classes\Foo.class 
target\test-classes\AddressSearchFieldsTest.class 
target\test-classes\UrlParameterStringAssert.class 

您應該檢查爲什麼你mvn clean compile試圖編譯測試類文件。

+0

正如我在其他評論中寫的那樣,我沒有做一個「乾淨的編譯」。我做了一個'clean install',這當然會編譯(並運行)測試文件。對不起,我沒有完全得到答案。我知道爲什麼測試正在編譯,這裏沒有什麼魔法('install'會這樣做)。我想知道的是,爲什麼它沒有做到這一點。 –

+0

@FlorianSchaetz對不起'mvn clean compile'的錯誤。是的,你說得對,'install'會編譯和執行測試類。但即使是'mvn clean install',我的答案中的零件都是開箱即用的。當你試圖單獨運行'javac'命令行(來自maven調試日誌)時,你會得到同樣的錯誤嗎? – SubOptimal