2015-12-16 6 views
4

У меня есть проект maven с использованием JAXWS-плагина для создания некоторого кода на основе WSDL с использованием wsimport. Если я запускаю mvn generate-sources, этот код генерируется.Использование сгенерированного кода в модульных тестах с помощью maven clean build?

Кроме того, у меня есть единичные тесты JUnit, которые ссылаются на генерируемые классы.

В соответствии с docs при установке по умолчанию тесты должны запускаться после источников генерации, чтобы они работали. Однако, если я запустил сборку на чистой рабочей области в eclipse, я получаю NoClassDefFound для одного из сгенерированных классов. Если вы затем запустите установку во второй раз, она будет работать.

Это было немного странно, поэтому я вышел из затмения и вернулся к основам командной строки. Если я эту последовательность я получаю ошибку NoClassDefFound:

  1. МВН чистый
  2. МВН установки

Однако, если я делаю следующее работает без ошибок:

  1. МВН чистый
  2. mvn clean install

Как это может быть? Я бы подумал, что mvn clean install будет эквивалентна mvn clean + mvn install?

Кроме того, когда это ошибки, я могу видеть на выходе консоли, что фаза генерации кода фактически выполняется до того, как она проведет тесты. Класс есть, но загрузчик классов, по-видимому, не видит этого.

Я не вижу никаких других ошибок в выводе на консоль. Всего несколько предупреждений о задании номеров версий плагина и исходных файлов закодированы в cp1252. Ничего захватывающего.

Я прочитал это question, но это меня не помогло. Я использую Java 8 jdk, поэтому мне интересно, есть ли здесь ошибка.

Редактировать

Я не уверен, если код очень помогает в этом случае, так как вы не можете запустить тестовую сборку без полного кода. Тем не менее, это может помочь увидеть сложность шагов pom и build, поэтому здесь представлена ​​отредактированная версия. Я только что переименовал несколько вещей, чтобы сделать его более анонимным, но функционально это то же самое.

Надеюсь, это поможет решить задаваемые вопросы.

<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

можете ли вы разместить дополнительную информацию о своем проекте? мультимодуль или нет? и если это мультимодуль: где тесты, где сгенерированный код ...? – ben75

+0

Несомненно. Это не мультимодульный. Только один стандартный военный проект с испытаниями в обычном src/test/java. Сгенерированный код отправляется в папку под целевым каталогом. Очевидно, что у меня есть код в src/main/java, который также зависит от сгенерированного кода, и все это компилируется нормально. Кроме того, работа во второй раз без очистки рабочей области означает, что тесты проходят, поэтому я думаю, что их местоположение, вероятно, хорошо. Я мог понять, если тест терпит неудачу каждый раз, но это только если вы делаете mvn clean, а затем устанавливаете mvn. Но mvn clean install works? –

ответ

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, а затем Обновить проект.

0

Я бы установил папку целевых/сгенерированных источников в качестве исходной папки, в которой вы используете IDE. Это может помочь.

+0

Спасибо, но я уже это сделал. Проект не будет компилироваться в eclipse, если он не был установлен как исходная папка. Кроме того, это повлияло бы только на затмение. Maven должен иметь возможность строить независимо от командной строки. –

 Смежные вопросы

  • Нет связанных вопросов^_^