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

标签 java maven jaxws-maven-plugin

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

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

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

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

  1. mvn 清理
  2. mvn 安装

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

  1. mvn 清理
  2. mvn 全新安装

这怎么可能?我原以为 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>

最佳答案

我一直在重新审视这个项目并重新审视这个问题。我浏览了 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,然后选择更新项目。

关于java - 使用 maven clean build 在单元测试中使用生成的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34317699/

相关文章:

java - 如何绕程序中心旋转椭圆?

java - 在 Java 8 中使用 lambda 出现意外错误

java - PreferenceActivity 子类不应在 list 中导出 (ExportedPreferenceActivity)

java - 为什么我的 "while(rs.next()) "无法执行我使用过的所有 if、ifelse、else?

java - 找不到 docker 文件

java.lang.VerifyError : Inconsistent stackmap frames at branch target 421 错误

jax-ws - jaxws : It is not a jaxws or a jaxb binding file

java - GC 期间未引用的套接字对象

maven - tomcat-maven-plugin 中的 truststoreFile 参数是什么意思/做什么?