为java / spring / maven应用程序组合和压缩javascript / css的不引人注目的方法?

时间:2011-11-21 12:42:12

标签: java javascript css minify

我想添加某种库,或maven插件,或“东西”来组合和压缩我的javascript和css源文件。

但是,我认为用Java进行不显眼的操作非常困难。 Rails人员已经解决了这个问题......它使用未加入/未压缩的文件进行开发,然后在生产过程中压缩所有内容。它不会引人注目,因为你不必更改你的html标题或类似的东西 - 它适用于测试和生产。这或多或少都是我想要的。它甚至存在于Java空间吗?

我想要的最后一件事是评论和取消注释用于开发和制作的freemarker / html代码行 - 我希望一切都是一样的。理想情况下,我希望能够让Tomcat运行并编写我的javascript和css代码,并立即查看我的更改 - 没有延迟或提升。我也不想在每次进行更改时手动运行命令来生成新的javascript ...或者甚至让一些守护进程不断更新它(因为那时我可能不会立即测试)。与此同时,如果我打算将我的战争打包生产,我希望它能够使用加入和压缩的文件。

这甚至可能吗?如果是这样,我应该看什么工具?我知道有很多人会这样做,但他们在“不显眼”方面做得不够。

由于

3 个答案:

答案 0 :(得分:13)

对我有用的解决方案是在构建生产时使用maven-minify-plugin(groupId为com.samaxes.maven)但。使用构建属性指定您是否处于开发模式。 Link to plugin

你可以拥有这样的东西(我不知道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。

编辑:这里要求的是在ServletContext上公开Spring定义的bean的代码:

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

答案 1 :(得分:5)

Jawr是一个提供css / js文件压缩和合并的库。它为html include语句提供了一个Tag。 这使得可以使用相同的未修改的JSP页面进行开发(使用未修改的css / js)和生产(合并和缩小)。

wro4j接触相似的功能。

答案 2 :(得分: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>

然后,在构建war文件时,不要覆盖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>

然后,内置的战争将包含完全相同的文件但压缩。 (这可能不是执行缩小的最佳方法,但它不会改变开发中的任何内容)

希望这会有所帮助......