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

时间:2015-12-16 16:54:46

标签: java maven jaxws-maven-plugin

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

此外,我还有JUnit单元测试,它引用了生成的类。

根据默认安装中的docs,测试应该在generate-sources之后运行,因此它应该可以工作。但是,如果我在eclipse中的干净工作区上运行构建,我会为其中一个生成的类获取NoClassDefFound。如果你再次运行安装它就可以了。

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

  1. mvn clean
  2. mvn install
  3. 但是,如果我执行以下操作,则无错误地运行:

    1. mvn clean
    2. mvn clean install
    3. 这怎么可能?我原以为mvn clean install会相当于mvn clean + mvn install吗?

      此外,当它出错时,我可以在控制台输出中看到代码生成阶段在进行测试之前实际运行。课程就在那里,但是类加载器显然无法看到它。

      我在控制台输出中没有看到任何其他错误。关于指定插件版本号和源文件的一些警告是在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>
      

1 个答案:

答案 0 :(得分:0)

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

<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程序,我不需要它,并且主类不存在。尽管如此,我还没有得到任何关于此的构建警告。

删除该插件可解决问题。这修复了它在命令行上,对于Eclipse,我还必须右键单击项目并选择Maven,然后选择Update project。