Использование сгенерированного кода в модульных тестах с чистой сборкой maven?
У меня есть проект maven, использующий плагин JAXWS для генерации некоторого кода на основе WSDL с использованием wsimport. Если я запускаю mvn generate-sources, этот код генерируется.
Кроме того, у меня есть модульные тесты JUnit, которые ссылаются на сгенерированные классы.
Согласно документации по установке по умолчанию, тесты должны запускаться после generate-sources, поэтому он должен работать. Однако, если я запускаю сборку в чистом рабочем пространстве в Eclipse, я получаю NoClassDefFound для одного из сгенерированных классов. Если вы затем запустите установку во второй раз, она будет работать.
Это было немного странно, поэтому я вышел из затмения и вернулся к основам командной строки. Если я делаю эту последовательность, я получаю ошибку NoClassDefFound:
- мвн чистый
- установить MVN
Однако, если я сделаю следующее, это будет работать без ошибки:
- мвн чистый
- mvn clean install
Как это может быть? Я бы подумал, что mvn clean install будет эквивалентно mvn clean + mvn install?
Кроме того, когда происходит ошибка, в выводе консоли я вижу, что фаза генерации кода действительно была запущена до выполнения тестов. Класс есть, но загрузчик классов, видимо, его не видит.
Я не вижу других ошибок в выводе консоли. Несколько предупреждений об указании номеров версий плагина и о том, что исходные файлы закодированы в cp1252. Ничего захватывающего.
Я прочитал этот вопрос, но он мне не помог. Я использую 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>
2 ответа
Я пересматривал этот проект и еще раз взглянул на проблему. Я прошел через пом и изучил все в поисках вещей, которые мог бы урезать или обновить. В процессе я заметил следующий плагин.
<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, а затем Обновить проект.
Я бы настроил целевую / сгенерированную исходную папку как исходную папку, в которой всегда используется IDE. Это может помочь.