Подтвердить что ты не робот

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

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

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

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

Возможно ли это? Если да, то на каком инструменте я должен смотреть? Я знаю, что есть немало, которые делают некоторые из этого, но они не оправдали "ненавязчивый" аспект.

Спасибо

4b9b3361

Ответ 1

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

У вас может быть что-то вроде этого (я не знаю 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 -defined beans в 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>

Ответ 2

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

wro4j для аналогичных функций.

Ответ 3

Использование 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 (которые уже сгенерированы в цели с помощью цели minify)

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

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

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