Ненавязчивый способ комбинировать и сжимать javascript / css для приложений java / spring / maven? - PullRequest
13 голосов
/ 21 ноября 2011

Я хотел бы добавить какую-нибудь библиотеку, или плагин maven, или что-то еще, чтобы объединить и сжать мои исходные файлы javascript и css.

Однако я думаю, что это довольно сложно сделать незаметно с Java. Люди из Rails в значительной степени решили эту проблему ... он использует несоединенные / несжатые файлы для разработки, а затем сжимает все в процессе производства. Он делает это ненавязчиво, поскольку вам не нужно менять заголовки HTML или что-то в этом роде - он работает как для тестирования, так и для производства. Это более или менее то, что я хочу. Он вообще существует в пространстве Java?

Последнее, что я хочу, это комментировать и раскомментировать строки кода freemarker / html для разработки и производства - я хочу, чтобы все было одинаково. В идеале я хотел бы иметь возможность оставить Tomcat запущенным и кодировать мой javascript и css, и увидеть мои изменения мгновенно - без задержек или сбоев. Я также не хочу, чтобы мне приходилось вручную запускать команду для генерации нового javascript каждый раз, когда я вносил изменения ... или даже чтобы какой-то демон постоянно обновлял его (потому что тогда это может быть не мгновенно при тестировании). В то же время, если я собираюсь собрать свою войну для производства, я хочу, чтобы вместо этого она использовала объединенные и сжатые файлы.

Это вообще возможно? Если да, то на какой инструмент я должен смотреть? Я знаю, что есть немало тех, кто делает это, но они потерпели неудачу в «ненавязчивом» аспекте.

Спасибо

Ответы [ 3 ]

13 голосов
/ 21 ноября 2011

Решение, которое сработало для меня, - это использование maven-minify-plugin (groupId com.samaxes.maven), но только при сборке для производства.Используйте свойство сборки, чтобы указать, находитесь ли вы в режиме разработки или нет. Ссылка на плагин

Затем вы можете получить что-то вроде этого (я не знаю freemarker, поэтому я просто вставляю некоторый код JSP, но я уверен, что он может быть легко преобразован):

<c:choose>
    <c:when test="${developmentMode}">
        <link rel="stylesheet" type="text/css" href="<c:url value="/css/custom1.css"/>"/>
        <link rel="stylesheet" type="text/css" href="<c:url value="/css/custom2.css"/>"/>
        <link rel="stylesheet" type="text/css" href="<c:url value="/css/another1.css"/>"/>
        <link rel="stylesheet" type="text/css" href="<c:url value="/css/another2.css"/>"/>
        <script type="text/javascript" src="<c:url value="/js/mylibrary.js"/>"></script>
        <script type="text/javascript" src="<c:url value="/js/more.js"/>"></script>
        <script type="text/javascript" src="<c:url value="/js/util.js"/>"></script>
        <script type="text/javascript" src="<c:url value="/js/whatever.js"/>"></script>
        <script type="text/javascript" src="<c:url value="/js/more.js"/>"></script>
    </c:when>
    <c:otherwise>
        <link rel="stylesheet" type="text/css" href="<c:url value="/css/minified.css"/>"/>
        <script type="text/javascript" src="<c:url value="/js/minified.js"/>"></script>
    </c:otherwise>
</c:choose> 

Таким образом, неминифицированный / комбинированный JS / css используется во время разработки, а минимизированный css используется только при сборке для производства.

РЕДАКТИРОВАТЬ: В соответствии с запросом здесь приведен код для представления Springопределяемые bean-компоненты в ServletContext:

<bean class="org.springframework.web.context.support.ServletContextAttributeExporter">
    <property name="attributes">
        <map>
            <!-- Obviously this can be changed to read from properties file -->
            <entry key="developmentMode" value="false" /> 
        </map>
    </property>
</bean>
5 голосов
/ 24 мая 2013

Jawr - это библиотека, которая обеспечивает сжатие и объединение файлов css / js.Он предоставляет тег для операторов включения HTML.Это позволяет использовать одну и ту же неизмененную страницу JSP для разработки (с неизмененными css / js) и для производства (объединение и минимизация).

wro4j швы с аналогичными функциями.

3 голосов
/ 13 мая 2014

Использование maven-minify-plugin работает и для меня.

Но мне удается найти еще менее навязчивый способ его использования, чем использование условных тегов, таких как c:when, путем объединения его с maven-war-plugin.

Этот фрагмент кода можно использовать как есть:

Во-первых, начните с минимизации CSS / JS без использования суффикса (что означает, что файлы сохраняют свое имя)

<plugin>
    <groupId>com.samaxes.maven</groupId>
    <artifactId>minify-maven-plugin</artifactId>
    <version>1.7.2</version>
    <executions>
        <execution>
            <id>default-minify</id>
            <phase>prepare-package</phase>
            <configuration>
               <charset>UTF-8</charset>
               <skipMerge>true</skipMerge> <!-- do not create one big file -->
               <nosuffix>true</nosuffix> <!-- do not use suffix like 'min' -->

               <cssSourceDir>css</cssSourceDir>
               <cssSourceIncludes>
                   <cssSourceInclude>*.css</cssSourceInclude>
               </cssSourceIncludes>

               <jsSourceDir>js</jsSourceDir>
               <jsSourceIncludes>
                   <jsSourceInclude>*.js</jsSourceInclude>
               </jsSourceIncludes>

           </configuration>
           <goals>
               <goal>minify</goal>
           </goals>
       </execution>
   </executions>

Тогда при построении файла войны не переопределяйте файлы CSS / JS (которые уже созданы в цели целью минификации)

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <!-- in order to use minify filed listed bellow -->
        <warSourceExcludes>**/*.css, **/*.js</warSourceExcludes>
    </configuration>
</plugin>

В этом случае встроенная война будет содержать те же самые файлы, но сжатые. (это может быть не лучший способ минимизации, но это ничего не меняет в процессе разработки)

Надеюсь, это поможет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...