Плагин YUI Compressor Maven запущен не вовремя, а плагин tomcat не использует выходные данные yui-компрессора

Я пытаюсь использовать плагин YUI Compressor для maven для сжатия моих CSS и JavaScript, но у меня возникли две проблемы.

  1. Моя конфигурация правильно сжимает и объединяет файлы JavaScript, но если я запускаю mvn package чтобы сделать файл войны, maven сожмет файлы JavaScript ДО того, как скопирует поверх src/main/webapp папка. Это перезаписывает все сжатые файлы CSS и JavaScript. Как я могу это исправить?

  2. Как заставить плагин Tomcat Maven использовать сжатые файлы JavaScript, а не те, что в моем src/main/webapp/scripts папка? Когда мое приложение пытается прочитать all.js, он терпит неудачу, потому что он расположен в target/ каталог, а не в моем src/main/webapps папка.

        <!-- Tomcat -->
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>tomcat-maven-plugin</artifactId>
            <version>1.1</version>
            <configuration>
                <warFile>target/myapp-1.0.war</warFile>
            </configuration>
        </plugin>
    
        <!-- YUI Compressor -->
        <plugin>
            <groupId>net.alchim31.maven</groupId>
            <artifactId>yuicompressor-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>compress</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <excludes>
                    <exclude>**/jwplayer.js</exclude>
                    <exclude>**/audio-player-noswfobject.js</exclude>
                    <exclude>**/audio-player-uncompressed.js</exclude>
                    <exclude>**/audio-player.js</exclude>
                    <exclude>**/jscharts.js</exclude>
                    <exclude>**/jquery-ui-1.8.16.custom.min.js</exclude>
                </excludes>
                <nosuffix>true</nosuffix>
                <jswarn>false</jswarn>
                <force>false</force>
                <aggregations>
                    <aggregation>
                        <removeIncluded>false</removeIncluded>
                        <insertNewLine>true</insertNewLine>
                        <output>${project.build.directory}/${project.build.finalName}/scripts/all.js</output>
                        <includes>
                            <include>**/json/json2.js</include>
                            <include>**/jwplayer/jwplayer.js</include>
                            <include>**/font/font.js</include>
                            <include>**/underscore/underscore.js</include>
                            <include>**/jquery/jquery-1.7.1.js</include>
                            <include>**/jquery/jquery-ui-1.8.16.custom.min.js</include>
                            <include>**/jquery/jquery.cookie.js</include>
                            <include>**/jquery/jquery.fancybox.js</include>
                            <include>**/jquery/jquery.highlight.js</include>
                            <include>**/jquery/jquery.jcrop.js</include>
                            <include>**/jquery/jquery.tmpl.js</include>
                            <include>**/jquery/farbtastic.js</include>
                            <include>**/jscharts/jscharts.js</include>
    
                            <include>**/myapp/homepage.js</include>
                        </includes>
                    </aggregation>
                </aggregations>
            </configuration>
        </plugin>
    

Или я просто иду о своей цели не в ту сторону?

Вот мавенский выход при упаковке войны. Вы можете видеть это, даже если я скажу yui:compress цель на этапе подготовки пакета, это все еще происходит до копирования ресурсов, так как это происходит в package фаза:

[INFO] ------------------------------------------------------------------------
[INFO] Building My App 1.0
[INFO] ------------------------------------------------------------------------
Downloading: http://repo1.maven.org/maven2/net/alchim31/maven/yuicompressor-maven-plugin/maven-metadata.xml
Downloading: http://snapshots.repository.codehaus.org/net/alchim31/maven/yuicompressor-maven-plugin/maven-metadata.xml
Downloading: http://download.java.net/maven/2/net/alchim31/maven/yuicompressor-maven-plugin/maven-metadata.xml
Downloading: http://oss.sonatype.org/content/groups/public/net/alchim31/maven/yuicompressor-maven-plugin/maven-metadata.xml
Downloaded: http://oss.sonatype.org/content/groups/public/net/alchim31/maven/yuicompressor-maven-plugin/maven-metadata.xml (442 B at 2.1 KB/sec)
Downloaded: http://repo1.maven.org/maven2/net/alchim31/maven/yuicompressor-maven-plugin/maven-metadata.xml (403 B at 0.9 KB/sec)
[INFO] 
[INFO] --- maven-resources-plugin:2.4.3:resources (default-resources) @ myapp ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 26 resources
[INFO] Copying 4 resources
[INFO] 
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ myapp ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-compiler-plugin:2.3.2:compile (default) @ myapp ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- aspectj-maven-plugin:1.3:compile (default) @ myapp ---
[INFO] 
[INFO] --- maven-resources-plugin:2.4.3:testResources (default-testResources) @ myapp ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 11 resources
[INFO] 
[INFO] --- maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ myapp ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- aspectj-maven-plugin:1.3:test-compile (default) @ myapp ---
[INFO] No modifications found skipping aspectJ compile
[INFO] 
[INFO] --- maven-surefire-plugin:2.6:test (default-test) @ myapp ---
[INFO] Tests are skipped.
[INFO] 
[INFO] --- yuicompressor-maven-plugin:1.2:compress (default) @ myapp ---
[INFO] 960.css (9989b) -> 960.css (5897b)[59%]
[INFO] base.css (24210b) -> base.css (16437b)[67%]
[INFO] reset.css (2062b) -> reset.css (1096b)[53%]
[INFO] text.css (1270b) -> text.css (598b)[47%]
[INFO] tinymce.css (1994b) -> tinymce.css (1277b)[64%]
[INFO] jquery.fancybox-1.3.4.css (8852b) -> jquery.fancybox-1.3.4.css (6975b)[78%]
[INFO] farbtastic.css (1362b) -> farbtastic.css (478b)[35%]
[INFO] jquery.jcrop.css (748b) -> jquery.jcrop.css (582b)[77%]
[INFO] base.css (34567b) -> base.css (25034b)[72%]
[INFO] jquery-ui-1.8.11.custom.css (33994b) -> jquery-ui-1.8.11.custom.css (25351b)[74%]
.... (tons of javascript files)
[INFO] why.js (515b) -> why.js (354b)[68%]
[INFO] underscore.js (26960b) -> underscore.js (9472b)[35%]
[INFO] total input (1832512b) -> output (1198425b)[65%]
[INFO] generate aggregation : C:\Users\egervari\IdeaProjects\myapp-development\target\myapp-1.0\scripts\all.js
[INFO] all.js (564342b)
[INFO] nb warnings: 0, nb errors: 0
[INFO] 
[INFO] --- maven-war-plugin:2.1.1:war (default-war) @ myapp ---
[INFO] Packaging webapp
[INFO] Assembling webapp [myapp] in [C:\Users\egervari\IdeaProjects\myapp-development\target\myapp-1.0]
[INFO] Processing war project
[INFO] Copying webapp resources [C:\Users\egervari\IdeaProjects\myapp-development\src\main\webapp]

Даже если изменение фазы сработало, мне также пришлось бы запустить это сжатие до tomcat:run также.

Вы считаете, что Maven - это не тот инструмент, который вам нужен? Или maven/java просто не подходит для тяжелой разработки javascript? Почему это так сложно?

2 ответа

Я столкнулся с подобной проблемой, и я изменил свою фазу на пакет. Надеюсь, это поможет кому-то еще.

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

Если вам действительно нужен nosuffix, вам нужно изменить фазу выполнения на "package".

    <executions>
      <execution>
        <phase>package</phase>
          <goals>
    ......
    .....

Любая фаза, предшествующая подготовке ресурсов, не работает, потому что, когда создается война, она берет js из исходного местоположения источника и тем самым перезаписывает минимизированные js (созданные во время фазы подготовки ресурсов) в целевом каталоге.

Минификация работает, когда вы удаляете nosuffix, потому что во время фазы пакета имена файлов отличаются, поэтому нет перезаписи файлов, и вы увидите как минимизированные, так и не минимизированные js-файлы в вашей целевой директории.

Чтобы обойти эту проблему, вы можете что-то, как.

(1) Поместите свой личный кодированный javascript в src/main/js, а не в src / main / webapp. Используйте соглашение MVN для размещения JS. * Примечание: для библиотек, которые вы включаете, например, jQuery или что-то еще, вы можете просто сбросить их в src/main/webapp, это нормально. У них уже будет свернутый JavaScript, который вы никогда не будете изменять.

(2) Настройте свой плагин YUI на (а) игнорирование JavaScript, который вы не кодировали, (б) для компиляции сжатого JavaScript в выходную папку.

       <plugin>
            <groupId>net.alchim31.maven</groupId>
            <artifactId>yuicompressor-maven-plugin</artifactId>
            <version>1.5.1</version>
            <executions>
                <execution>
                    <goals>
                        <goal>compress</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <nosuffix>true</nosuffix>

                <excludes>
                    <exclude>**/ui-framework/**</exclude>
                </excludes>
                <outputDirectory>${yui.outputdir}</outputDirectory>
            </configuration>
        </plugin>

Итак, с этим мы можем сделать следующее упражнение.

mvn process-resources


└── target
├── classes
│   ├── default.logback.xml
│   └── props
│       ├── default.props
│       └── production.default.props
├── packageLinkDefs.properties
└── yui-compressed
    └── jasmineDummyExample_element_mover.js

Дело в том, что YUI компилирует сжатый javascript в свою собственную выходную папку, и плагин войны не имеет об этом никакого представления.

(3) Наконец, вам просто нужно настроить свой плагин войны, чтобы скопировать скомпилированные исходники yui.

Пока вы соблюдаете соглашение javascript для maven, где ваш javascript должен был быть закодирован в src/main/js /, ваш плагин войны по умолчанию не будет копировать ваш javascipt (звучит странно, правда?).

По умолчанию ваш военный плагин будет копировать все статические ресурсы в каталоге src / main / webapp. Это удобно, потому что это позволяет вам настроить плагин war для поведения по умолчанию: копировать src / main / webapp в окончательный файл war и, кроме того, копировать папку / src / target / yui-compress. Таким образом, в обеих папках нет перекрывающихся файлов, в выходном каталоге не происходит перезапись файлов.

Это показано в следующем фрагменте:

$ mvn war:war
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building lift-someproject Project 1.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-war-plugin:2.5:war (default-cli) @ lift-someproject ---
[INFO] Packaging webapp
[INFO] Assembling webapp [lift-someproject] in [D:\scalaWorkspace\liftsomeprojectTwo\lift-someproject\target\lift-someproject]
[INFO] Processing war project
[INFO] Copying webapp webResources [D:\scalaWorkspace\liftsomeprojectTwo\lift-someproject\target\yui-compressed] to [D:\scalaWorkspace\liftsomeprojectTwo\lift-someproject\target\lift-someproject]
[INFO] Copying webapp resources [D:\scalaWorkspace\liftsomeprojectTwo\lift-someproject\src\main\webapp]
[INFO] Webapp assembled in [820 msecs]
[INFO] Building war: D:\scalaWorkspace\liftsomeprojectTwo\lift-someproject\target\lift-someproject.war
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 12.968s
[INFO] Finished at: Tue Dec 23 20:17:59 CET 2014
[INFO] Final Memory: 11M/246M
[INFO] ------------------------------------------------------------------------

Вы можете настроить свой war-файл, чтобы знать о специальной папке с вашими не раздавленными yui-сжатыми файлами JS:

   <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.5</version>
            <configuration>
                <webResources>
                    <resource>
                        <directory>${yui.outputdir}</directory>
                        <targetPath>js</targetPath>
                    </resource>
                </webResources>
            </configuration>
        </plugin>

Если вы используете Jetty для быстрой разработки, вам понадобится немного больше узнать об этом плагине, чтобы убедиться, что он находит ваш javascript, закодированный вручную, в src/main/js.

Это должно работать.

Другие вопросы по тегам