2015-12-29 2 views
-1

Кажется, что весенний ботинок будет переупаковать пакет, сгенерированный фазой пакета maven, а затем переупаковать войну, чтобы сделать ее выполнимой.Создайте несколько битв за весеннюю загрузку

Теперь я хочу genrate несколько войн для различных сред с помощью одной команды Maven, я пытался использовать maven-assembly-plugin:

1 unzip the war generated by `spring-boot-maven` plugin to a directory 
2 Assembly with the files in the directory, and add some other filtered resources 
3 create the war 

Проверить этот пост: generate multiple artifacts in maven

В то время как это работает, и я получил множественный войн, но ни один из них не может быть выполнен на java -jar xx.war. Кажется, что классы повреждены.

Так что интересно, есть ли альтернативное решение?


обновление моего pom.xml:

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <packaging>war</packaging> 
    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.3.1.RELEASE</version> 
    </parent> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>build-helper-maven-plugin</artifactId> 
       <executions> 
        <execution> 
         <phase>generate-sources</phase> 
         <goals> 
          <goal>add-source</goal> 
         </goals> 
         <configuration> 
          <sources> 
           <source>src/main/as-common</source> 
           <source>src/main/as-server</source> 
           <source>src/main/as-app</source> 
          </sources> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 

    <profiles> 
     <profile> 
      <id>release</id> 
      <build> 
       <plugins> 
        <!-- unzip the contents of the war(executeable) generated by spring-boot to a certain directory --> 
        <plugin> 
         <groupId>org.apache.maven.plugins</groupId> 
         <artifactId>maven-antrun-plugin</artifactId> 
         <version>1.8</version> 
         <executions> 
          <execution> 
           <id>extract_spring_war</id> 
           <phase>package</phase> 
           <configuration> 
            <target> 
             <echo message="extract war generated by spring-boot-maven-plugin"/> 
             <delete dir="${basedir}/target/${project.build.finalName}-spring" includeemptydirs="true"/> 
             <unzip src="${basedir}/target/${project.build.finalName}.war" dest="${basedir}/target/${project.build.finalName}-spring/"/> 
            </target> 
           </configuration> 
           <goals> 
            <goal>run</goal> 
           </goals> 
          </execution> 
         </executions> 
        </plugin> 
        <plugin> 
         <groupId>com.soebes.maven.plugins</groupId> 
         <artifactId>iterator-maven-plugin</artifactId> 
         <version>0.3</version> 
         <executions> 
          <execution> 
           <phase>package</phase> 
           <goals> 
            <goal>iterator</goal> 
           </goals> 
           <configuration> 
            <items> 
             <item>test</item> 
             <item>dep1</item> 
             <item>dep2</item> 
            </items> 
            <pluginExecutors> 
             <pluginExecutor> 
              <plugin> 
               <groupId>org.apache.maven.plugins</groupId> 
               <artifactId>maven-assembly-plugin</artifactId> 
               <version>2.6</version> 
              </plugin> 
              <goal>single</goal> 
              <configuration> 
           <archive> 
            <manifest> 
             <mainClass>org.springframework.boot.loader.WarLauncher</mainClass> 
            </manifest> 
           </archive> 

               <descriptors> 
                <descriptor>src/main/assembly/assembly.xml</descriptor> 
               </descriptors> 
              </configuration> 
             </pluginExecutor> 
            </pluginExecutors> 
           </configuration> 
          </execution> 
         </executions> 
        </plugin> 
       </plugins> 
      </build> 
     </profile> 
    </profiles> 
</project> 

assmbly.xml:

<assembly> 
    <id>${item}</id> 
    <formats> 
     <format>war</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <fileSets> 
     <!-- file from the unpacked contents --> 
     <fileSet> 
      <directory>target/${project.build.finalName}-spring</directory> 
      <outputDirectory>/</outputDirectory> 
      <includes> 
       <include>**/*</include> 
      </includes> 
      <filtered>true</filtered> 
     </fileSet> 

     <!-- add environment awared resources --> 
     <fileSet> 
      <outputDirectory>/WEB-INF/classes</outputDirectory> 
      <directory>${basedir}/src/main/custom/</directory> 
      <includes> 
       <include>${item}.properties</include> 
      </includes> 
     </fileSet> 
    </fileSets> 
</assembly> 

Update:

Сначала я получил ошибку:

No main class detected 

Затем я добавляю следующее за maven-assembly-plugin,

<archive> 
    <manifest> 
     <mainClass>org.springframework.boot.loader.WarLauncher</mainClass> 
    </manifest> 
</archive> 

После этого я переупаковка войны, и я получил сообщение об ошибке, когда я побежал:

Error: A JNI error has occurred, please check your installation and try again 
Exception in thread "main" java.lang.ClassFormatError: Incompatible magic value 4022320623 in class file org/springframework/boot/loader/WarLauncher 
+0

Можете ли вы показать свой файл pom и дескриптор сборки, как вы это сделали? – khmarbaise

+0

Вы не хотите, чтобы ... Вы хотите тот же артефакт для разных сред, различия должны быть настраиваемыми. Как вы собираетесь гарантировать, что у вас одинаковые функциональные возможности во всех войнах? Выполняете ли вы все тесты во всех войнах (даже те неавтоматические тесты?). Обычно (re) генерирование артефактов для разных сред - это то, чего вы не хотите, и обычно это признак того, что что-то еще не так. –

+0

@ M.Deinum: Я уверен, что все войны имеют одинаковую функциональность. – hguser

ответ

1

Файлы классов в настоящее время повреждены при переупаковка файла войны. Я подозреваю, что это потому, что вы фильтруя все файлы:

<fileSet> 
    <directory>target/${project.build.finalName}-spring</directory> 
    <outputDirectory>/</outputDirectory> 
    <includes> 
     <include>**/*</include> 
    </includes> 
    <filtered>true</filtered> 
</fileSet> 

Вы не хотите фильтровать бинарные файлы, поскольку они могут оказаться данные, что выглядит как ${} заполнитель. Вы должны обновить сборку, чтобы избежать применения фильтрации к файлам классов. Самый простой способ сделать это было бы отключить фильтрацию полностью:

<fileSet> 
    <directory>target/${project.build.finalName}-spring</directory> 
    <outputDirectory>/</outputDirectory> 
    <includes> 
     <include>**/*</include> 
    </includes> 
    <filtered>false</filtered> 
</fileSet> 

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

+0

Спасибо, что «вопрос, он работает сейчас, вы спасаете мою жизнь, я потратил на это почти одну неделю. :) – hguser

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