2013-07-15 3 views
0

У меня есть веб-приложение Maven. Это занимает слишком много времени для создания (30-40 минут). Я хотел бы уменьшить его до менее 10 минут. Мой pom.xml выглядит следующим образом.оптимизация maven build perfomance

<?xml version="1.0" encoding="utf-8"?> 
<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/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
     <groupId>se.mysite.etc.settings</groupId> 
     <artifactId>projects</artifactId> 
     <version>1.5</version> 
    </parent> 
    <groupId>se.myweb.portal</groupId> 
    <artifactId>myweb-se-main</artifactId> 
    <name>myweb-se-main</name> 
    <version>3.1.81-B2_forv-SNAPSHOT</version> 
    <packaging>pom</packaging> 
    <inceptionYear>2009</inceptionYear> 
    <properties> 
     <release.version>${project.version}</release.version> 
     <acc.version>2.3.42-TEST-MAINT-SNAPSHOT</acc.version> 
     <cxf.version>2.5.3</cxf.version> 
     <spring.version>3.0.3.RELEASE</spring.version> 
     <spring.security.version>2.0.4</spring.security.version> 
     <spring.webflow.version>2.1.1.RELEASE</spring.webflow.version> 
     <commonportal.version>1.9.9-SPRING3</commonportal.version>   
     <junit.version>4.5</junit.version> 
     <java.source.version>1.6</java.source.version> 
     <cobertura.maxmem>1024M</cobertura.maxmem> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 
    <scm> 
     <connection>scm:hg:http://test1/myweb</connection> 
     <developerConnection>scm:hg:http://test1/myweb</developerConnection> 
     <tag/> 
     <url>http://test1/myweb</url> 
    </scm> 
    <profiles> 
     <profile> 
      <id>dev</id> 
      <dependencies> 
       <!--some dependencies--> 
      </dependencies> 
      <modules> 
       <module>../project1</module> 
       <module>../project2</module> 
       <module>../project3</module> 
       <module>../project4</module> 
      </modules> 
     </profile> 
     <profile> 
      <id>dist</id> 
      <activation> 
       <activeByDefault>true</activeByDefault> 
      </activation> 
      <dependencies> 
       <!--some dependencies--> 
      </dependencies> 
      <modules> 
       <module>../project1</module> 
       <module>../project2</module> 
       <module>../project3</module> 
       <module>../project4</module> 
       <module>../project5</module> 
       <module>../project6</module> 
      </modules> 
     </profile> 
     <profile> 
      <id>backend</id> 
      <dependencies> 
       <!--some dependencies--> 
      <modules> 
       <module>../project3</module> 
       <module>../project1</module> 
       <module>../project2</module> 
       <module>../project4</module> 
       <module>../project9</module> 
      </modules> 
     </profile> 
     <profile> 
      <id>frontend</id> 
      <!--some dependencies--> 
      <modules> 
       <module>../project10</module> 
       <module>../project11</module> 
      </modules> 
      <build> 
       <plugins> 
        <plugin> 
         <groupId>org.apache.maven.plugins</groupId> 
         <artifactId>maven-surefire-plugin</artifactId> 
         <version>2.12.4</version> 
         <configuration> 
          <forkMode>always</forkMode> 
          <argLine>-Xms512m -Xmx2048m -XX:MaxPermSize=2048m</argLine> 
         </configuration> 
        </plugin> 
       </plugins> 
      </build> 
     </profile> 
     <profile> 
      <id>webtest</id> 
      <build> 
       <finalName>myweb-web-test</finalName> 
       <plugins> 
        <plugin> 
         <groupId>org.apache.maven.plugins</groupId> 
         <artifactId>maven-surefire-plugin</artifactId> 
         <configuration> 
          <argLine>-XX:MaxPermSize=512m</argLine> 
         </configuration> 
        </plugin> 
       </plugins> 
      </build> 
      <!--some dependencies--> 
      <modules> 
       <module>../myweb-web-test</module> 
      </modules> 
     </profile> 
     <profile> 
      <id>redeploy_web_app</id> 
      <activation> 
       <property> 
        <name>redeployWebApp</name> 
       </property> 
      </activation> 
      <properties> 
       <user.tomcat.home>${env.DEST_DIR}</user.tomcat.home> 
      </properties> 
      <build> 
       <pluginManagement> 
        <plugins> 
         <plugin> 
          <groupId>org.apache.maven.plugins</groupId> 
          <artifactId>maven-antrun-plugin</artifactId> 
          <version>1.6</version> 
          <dependencies> 
           <!--some dependencies--> 
          </dependencies> 
          <executions> 
           <execution> 
            <id>delete_project_artifact</id> 
            <phase>prepare-package</phase> 
            <configuration> 
             <tasks> 
              <taskdef classpathref="maven.plugin.classpath" resource="net/sf/antcontrib/antcontrib.properties"/> 
              <if> 
               <equals arg1="${project.packaging}" arg2="war"/> 
               <then> 
                <echo message="Removing ${project.artifactId}.${project.packaging} from ${user.tomcat.home}/webapps"/> 
                <delete dir="${user.tomcat.home}/webapps/${project.artifactId}"/> 
                <delete file="${user.tomcat.home}/webapps/${project.artifactId}.${project.packaging}"/> 
               </then> 
              </if> 
             </tasks> 
            </configuration> 
            <goals> 
             <goal>run</goal> 
            </goals> 
           </execution> 
           <execution> 
            <id>copy_project_artifact</id> 
            <phase>package</phase> 
            <configuration> 
             <tasks> 
              <taskdef classpathref="maven.plugin.classpath" resource="net/sf/antcontrib/antcontrib.properties"/> 
              <if> 
               <equals arg1="${project.packaging}" arg2="war"/> 
               <then> 
                <echo message="Copying ${project.build.finalName}.${project.packaging}"/> 
                <copy file="${project.build.directory}/${project.build.finalName}.${project.packaging}" overwrite="true" tofile="${user.tomcat.home}/webapps/${project.artifactId}.${project.packaging}"/> 
               </then> 
              </if> 
             </tasks> 
            </configuration> 
            <goals> 
             <goal>run</goal> 
            </goals> 
           </execution> 
          </executions> 
         </plugin> 
        </plugins> 
       </pluginManagement> 
       <plugins> 
        <plugin> 
         <groupId>org.apache.maven.plugins</groupId> 
         <artifactId>maven-antrun-plugin</artifactId> 
        </plugin> 
       </plugins> 
      </build> 
     </profile> 
    </profiles> 
    <!-- General dependencies --> 


    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>cobertura-maven-plugin</artifactId> 
       <version>2.2</version> 
       <configuration> 
        <instrumentation> 
         <excludes> 
          <exclude>se.mysite/**/Test*.class</exclude> 
         </excludes> 
        </instrumentation> 
       </configuration> 
       <executions> 
        <execution> 
         <goals> 
          <goal>clean</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <configuration> 
        <!-- TODO: Use UTF-8 here or not??? --> 
        <encoding>UTF-8</encoding> 
        <!-- encoding>ISO-8859-1</encoding--> 
        <source>${java.source.version}</source> 
        <target>${java.source.version}</target> 
        <showDeprecation>true</showDeprecation> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-release-plugin</artifactId> 
       <version>2.1</version> 
       <configuration> 
        <scmCommentPrefix>II Release:</scmCommentPrefix> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
    <organization> 
     <name>mysite AB</name> 
     <url>http://www.mysite.se</url> 
    </organization> 
</project> 

Моя команда компиляции приведена ниже.

mvn -U -DartifactsTarget=$DEST_DIR/lib/tpp -P dev -Dmaven.test.failure.ignore=true -Dtesting.testsToExclude=**/Test*.java -f pom.xml $* -DredeployWebApp install 

Это займет почти 30 минут, чтобы построить.

Я использую maven 3.0.4. Я исследовал, что, используя следующие опции, мы можем оптимизировать время сборки.

  1. Использование Maven параллельной обработки
  2. Использование сплетение компилятора плагин
  3. Использование Maven питания оболочки

Пожалуйста, дайте мне знать, если мне нужно каких-либо других изменений в моей pom.xml или любых других методов что оптимизирует производительность.

+0

Пожалуйста, укажите «слишком много времени» и укажите, на какое время вы стремитесь. (это имеет значение, если он теперь работает в течение 10 секунд, и вы хотите сократить до 1 секунды, или если он построит 30 минут, и вы хотите, чтобы он работал через 15 минут) – rene

+0

@rene. Извините, я забыл упомянуть об этом. В настоящее время он занимает примерно 30-40 минут. Я хотел бы оптимизировать его таким образом, чтобы сборка выполнялась через 10 минут. – Patan

+0

Вы анализировали время, необходимое для создания ваших модулей? Может быть, есть тот, который занимает гораздо больше времени, чем другие? –

ответ

0

Оптимизация Maven сборки проекта Java сводится к 3-х факторов:

  1. Составление и тесты
  2. Сложность Maven построить
  3. Оптимизация Maven (двоичный) производительность

Компиляция и тесты

Если, например, у вас есть GWT в вашей заявке и вы компилируете для 20 разных перестановок, тогда это будет проблемой, если вы делаете это все время.

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

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

  1. Не используйте Thread.sleep(..), используйте мьютексы и замки.
  2. Разделите конфигурацию (единицы измерения настойчивости, mocks) на нескольких тестах вместо того, чтобы выполнять настройку для каждого теста.
  3. Сделайте это модульным тестом вместо теста интеграции, если только вам это не нужно. В любом случае слишком много интеграционных тестов - плохой запах кода.

Сложность Maven сборка

Если у вас есть 10-й или сотни модулей, со сложным деревом зависимостей, Maven нужно время, чтобы вычислить дерево зависимостей. Используйте «зависимость: анализ», чтобы выяснить, есть или нет неиспользуемые зависимости и удалить их.

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

Оптимизация Maven (двоичный) производительность

Я использую следующие параметры:

export MAVEN_OPTS="-Dmaven.wagon.provider.http=httpclient -Dmaven.artifact.threads=12 -Dhttp.tcp.nodelay=false -Xmx2048M -Xss256M -XX:+CMSClassUnloadingEnabled -XX:-UseGCOverheadLimit -XX:MaxPermSize=256M -T2C"

  • -Dmaven.wagon.provider.http=httpclient: Изменения механизма соединения HTTP, моя теория состоит в том, что библиотека Apache HttpClient быстрее и лучше, чем стандартная Java HttpURLConnection класс
  • -Dmaven.artifact.threads=12: Количество потоков, используемых для загрузки артефактов.
  • -Dhttp.tcp.nodelay=false: Отключает алгоритм Nagle, увеличивающий производительность (но также и используемую полосу пропускания). Это собственность Вагона.
  • -T2C: Это была устаревшая сборка, введенная в maven 3: количество потоков для каждой сборки. См. Parallel builds in Maven 3

Пожалуйста, отредактируйте это сообщение, если у вас есть другие советы!