使用 maven clean build 在单元测试中使用生成的代码?

Using generated code in unit tests with maven clean build?

我有一个 Maven 项目使用 JAXWS 插件生成一些基于使用 wsimport 的 WSDL 的代码。如果我 运行 mvn generate-sources 将生成此代码。

此外,我还有引用生成的 classes.

的 JUnit 单元测试

根据默认安装中的 docs,测试应该 运行 在生成源之后进行,因此它应该可以工作。但是,如果我 运行 在 eclipse 中的干净工作区上构建,我会为生成的 classes 之一得到 NoClassDefFound。如果你然后 运行 第二次安装它就可以了。

这有点奇怪所以我退出了 eclipse 并回到命令行上的基础知识。如果我执行此序列,我会收到 NoClassDefFound 错误:

  1. mvn clean
  2. mvn 安装

但是,如果我执行以下操作,它会正常工作而不会出现错误:

  1. mvn clean
  2. mvn 全新安装

怎么会这样?我原以为 mvn clean install 等同于 mvn clean + mvn install?

此外,当它出错时,我可以在控制台输出中看到代码生成阶段在执行测试之前实际上已经 运行。 class 在那里,但 classloader 显然看不到它。

我在控制台输出中没有看到任何其他错误。只是一些关于指定插件版本号和源文件以 cp1252 编码的警告。没什么好激动的。

我确实读过这个 question 但它对我没有帮助。我正在使用 Java 8 jdk 所以我想知道这里是否有错误。

编辑

我不确定代码在这种情况下是否有很大帮助,因为如果没有完整的代码库,您将无法 运行 测试构建。但是,它可能有助于了解 pom 的复杂性和构建步骤,所以这里是一个编辑过的版本。我刚刚重命名了一些东西以使其更加匿名,但在功能上是一样的。

希望它能帮助解决所提出的问题。

<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.company</groupId>
    <artifactId>MyApp</artifactId>
     <version>1.0.0</version>
    <packaging>war</packaging>

    <name>MyApp</name>

    <properties>
        <java-version>1.6</java-version>
        <spring-version>4.1.4.RELEASE</spring-version>
        <hibernate-version>4.3.7.Final</hibernate-version>
        <org.slf4j-version>1.6.6</org.slf4j-version>
    </properties>

    <dependencies>  

        <!-- JAXWS web services -->
        <dependency>
            <groupId>com.sun.xml.ws</groupId>
            <artifactId>jaxws-rt</artifactId>
            <version>2.2.7</version>
        </dependency>

        <!-- Spring DI -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring-version}</version>
            <exclusions>
              <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
              </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring-version}</version>
        </dependency>   
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring-version}</version>
        </dependency>

        <!-- Spring integration with JAX-WS -->     
        <dependency>
            <groupId>org.jvnet.jax-ws-commons.spring</groupId>
            <artifactId>jaxws-spring</artifactId>
            <version>1.8</version>  
            <exclusions>
              <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring</artifactId>
              </exclusion>
            </exclusions>           
        </dependency>

        <!-- JPA Provider (Hibernate) -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>${hibernate-version}</version>
        </dependency>       

        <!-- DataSource (HikariCP) -->
        <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP-java6</artifactId>
            <version>2.3.2</version>
        </dependency>

        <!-- AS400 access -->
        <dependency>
            <groupId>net.sf.jt400</groupId>
            <artifactId>jt400</artifactId>
            <version>6.7</version>
        </dependency>

        <!-- Logging -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${org.slf4j-version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>${org.slf4j-version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${org.slf4j-version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.mail</groupId>
                    <artifactId>mail</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.jms</groupId>
                    <artifactId>jms</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jdmk</groupId>
                    <artifactId>jmxtools</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jmx</groupId>
                    <artifactId>jmxri</artifactId>
                </exclusion>
            </exclusions>
            <scope>runtime</scope>
        </dependency>               

        <!-- Servlet - provided by container -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.sun.xml.parsers</groupId>
            <artifactId>jaxp-ri</artifactId>
            <version>1.4.5</version>
        </dependency>

        <!-- Test -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>     
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring-version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <version>1.9.5</version>
            <scope>test</scope>
        </dependency>   
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-eclipse-plugin</artifactId>
                <version>2.9</version>
                <configuration>
                    <additionalProjectnatures>
                        <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
                    </additionalProjectnatures>
                    <additionalBuildcommands>
                        <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
                    </additionalBuildcommands>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>true</downloadJavadocs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>${java-version}</source>
                    <target>${java-version}</target>
                    <compilerArguments>
                  <endorseddirs>${project.build.directory}/endorsed</endorseddirs>               
                    </compilerArguments>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
                    <mainClass>org.test.int1.Main</mainClass>
                </configuration>
            </plugin>
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-dependency-plugin</artifactId>
              <version>2.3</version>
              <executions>
                <execution>
                  <phase>validate</phase>
                  <goals>
                    <goal>copy</goal>
                  </goals>
                  <configuration>
                    <outputDirectory>${project.build.directory}/endorsed</outputDirectory>
                    <silent>true</silent>
                    <artifactItems>
                      <artifactItem>
                        <groupId>javax.xml.bind</groupId>
                        <artifactId>jaxb-api</artifactId>
                        <version>2.2.4</version>
                        <type>jar</type>
                      </artifactItem>
                      <artifactItem>
                        <groupId>javax.xml.ws</groupId>
                        <artifactId>jaxws-api</artifactId>
                        <version>2.2.8</version>
                        <type>jar</type>
                      </artifactItem>
                      <artifactItem>
                        <groupId>javax.xml.bind</groupId>
                        <artifactId>jaxb-api</artifactId>
                        <version>2.2.4</version>
                        <type>jar</type>
                      </artifactItem>
                    </artifactItems>
                  </configuration>
                </execution>
              </executions>
            </plugin>
            <plugin>
              <groupId>org.jvnet.jax-ws-commons</groupId>
              <artifactId>jaxws-maven-plugin</artifactId>
              <version>2.2</version>
              <executions>
                <execution>
                  <goals>
                    <goal>wsimport</goal>
                  </goals>
                </execution>
              </executions>
              <configuration>
              <!-- Configuration for generating the jaxws code -->
                <wsdlDirectory>${basedir}/src/main/resources/wsdl</wsdlDirectory>
                <wsdlLocation>wsdl/mywsdl.wsdl</wsdlLocation>
                <packageName>com.company.generated</packageName>
                <keep>true</keep>
                <sourceDestDir>${basedir}/target/generated-sources/src/main/java</sourceDestDir> 
              </configuration>
            </plugin>           
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-source-plugin</artifactId>
              <executions>
                <execution>
                  <id>attach-sources</id>
                  <goals>
                    <goal>jar</goal>
                  </goals>
                </execution>
              </executions>
            </plugin>            
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <excludes>
                    <!-- Exclude these files from the build -->
                    <exclude>**/log4j.xml</exclude>
                </excludes>
            </resource>
        </resources>
    </build>
</project>

我会将 target/generated-sources 文件夹配置为您正在使用的 IDE 的源文件夹。这可能会有所帮助。

我一直在重新审视这个项目,并重新审视了这个问题。我检查了 pom 并仔细检查了所有寻找我可以 trim 删除或更新的东西。在此过程中,我发现了以下插件。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.2.1</version>
    <configuration>
        <mainClass>org.test.int1.Main</mainClass>
    </configuration>
</plugin>

我认为这一定是我们刚开始使用 maven 时从某处的示例中复制过来的。该插件用于在我不需要的构建期间执行 Java 程序,并且主程序 class 不存在。不过,我还没有收到任何关于此的构建警告。

删除那个插件解决了这个问题。这将它固定在命令行上,对于 Eclipse,我还必须右键单击项目和 select Maven,然后更新项目。