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

Я пытаюсь использовать плагин 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>
    

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

Вот вывод maven при упаковке войны.Вы можете видеть, что даже если я сообщу цель 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 ]

4 голосов
/ 11 марта 2013

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

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

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

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

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

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

1 голос
/ 23 декабря 2014

Чтобы обойти эту проблему, вам может понравиться что-то подобное.

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

(2) Настройте свой плагин YUI на (a) игнорирование JavaScript, который вы не кодировали, (b) для компиляции сжатого 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 в свою собственную папку вывода, а плагин war имеетпонятия не имею об этом.

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

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

По умолчанию ваш плагин war будет копировать все статические ресурсы, находящиеся в каталоге 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, чтобы иметь в виду специальную папку с вашими не разбитыми сжатыми файлами JS yui:

   <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.

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

...