10

所以我正在尝试一些我认为相当简单的东西,我基本上希望 maven 在构建战争之前为我缩小我所有的 js 和 css 文件。我的插件看起来像这样:

         <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <extensions>true</extensions>
            <version>1.0.0</version>
            <configuration>
                <manifestLocation>META-INF</manifestLocation>
                <instructions>
                    <Export-Package>!test.impl,test*</Export-Package>
                    <Import-Package>*</Import-Package>
                    <!--
                       add ,plugin.xml if it's present i.e.
                       src/main/resources,plugin.xml
                    -->
                    <Include-Resource>src/main/resources</Include-Resource>
                </instructions>
            </configuration>
        </plugin>

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

问题是 YUI 插件确实正确地缩小了文件,但是在构建战争之前,它看起来像是从我的主源目录复制了所有文件,从而消除了 YUI 插件所做的更改。

我通过以下方式调用 maven mvn compile war:war:我已经用不同的设置玩了一段时间,但到目前为止我还没有找到解决这个问题的方法。

我想要的是在战争从 src 目录复制它所需的文件之后,它将运行 YUI 插件,但我尝试了 YUI 插件上的所有阶段排列,但这似乎没有任何作用不同之处。

我已经四处搜索,但到目前为止我读到的几乎所有内容似乎都表明我应该只需要像我一样将 YUI 插件放在那里,一切都应该神奇地工作。到目前为止,我似乎还没有找到魔法。

4

5 回答 5

25

接受的答案不起作用。

这个答案要好得多(正如 koga 在他的评论中指出的那样): https ://stackoverflow.com/a/11495021/11451

这是我最终做的事情:

第 1 步:缩小 css 和 js

<plugin>
    <groupId>com.samaxes.maven</groupId>
    <artifactId>minify-maven-plugin</artifactId>
    <version>1.7.2</version>
    <executions>
        <execution>
            <phase>prepare-package</phase>
            <goals>
                <goal>minify</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <charset>UTF-8</charset>
        <skipMerge>true</skipMerge>
        <cssSourceDir>resources</cssSourceDir>
        <jsSourceDir>resources</jsSourceDir>
        <jsEngine>CLOSURE</jsEngine>
        <nosuffix>true</nosuffix>
        <webappTargetDir>${project.build.directory}/minify</webappTargetDir>
        <cssSourceIncludes>
            <cssSourceInclude>**/*.css</cssSourceInclude>
        </cssSourceIncludes>
        <cssSourceExcludes>
            <cssSourceExclude>**/*.min.css</cssSourceExclude>
        </cssSourceExcludes>
        <jsSourceIncludes>
            <jsSourceInclude>**/*.js</jsSourceInclude>
        </jsSourceIncludes>
        <jsSourceExcludes>
            <jsSourceExclude>**/*.min.js</jsSourceExclude>
        </jsSourceExcludes>
    </configuration>
</plugin>

第二步:用缩小文件覆盖war中的css和js

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <webResources>
            <resource>
                <directory>${project.build.directory}/minify</directory>
            </resource>
        </webResources>
    </configuration>
</plugin>
于 2014-05-29T09:56:38.060 回答
6

使用战争生成器并添加配置以排除源文件。例子:

    <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>${war-plugin.version}</version>
              <configuration> 
                <warSourceExcludes>js/**/*.js</warSourceExcludes> 
            </configuration> 
    </plugin>

之后,您需要将目标文件包含到您的战争中。您可以通过设置 Maven 生命周期的“准备包”阶段(我正在使用 Minify 插件)并在 Minify 配置中添加文件(jsSourceIncludes、cssSourceIncludes、...)

例如:

         <plugin>
            <groupId>com.samaxes.maven</groupId>
            <artifactId>minify-maven-plugin</artifactId>
            <version>1.7.2</version>
            <executions>
              <execution>
                <id>default-minify</id>
                <goals>
                    <goal>minify</goal>
                </goals>
               <phase>prepare-package</phase>
                <configuration>
                     <jsSourceDir>/js</jsSourceDir>
                     <jsSourceIncludes>
                        <jsSourceInclude>/**/*.js</jsSourceInclude>
                     </jsSourceIncludes>
                </configuration>
              </execution>
            </executions>
          </plugin>
于 2014-05-05T21:12:46.397 回答
5

发生的情况是,上面的配置在 process-resources 阶段运行压缩器,但随后 package 阶段用原始文件覆盖了这些文件。

通过将阶段更改为打包,它应该可以工作:

<execution>
    <phase>package</phase>
    <goals>
        <goal>compress</goal>
    </goals>

现在压缩是在复制到目标的文件之后完成的,以便构建 WAR 内容。

发生这种情况的原因是,仅压缩文件而不连接它们或使用后缀重命名它们并不是该插件最常见的用例。

通常我们只想将文件压缩并连接成一个文件,并给它一个新名称。

新名称通常类似于 originalname-min.css / original.name-min.js ,其中 .min 是后缀,因此删除上述配置中的 nosuffix 选项也可以。

编辑:日志示例

[INFO] --- yuicompressor-maven-plugin:1.1:compress (default) @ yui-compressor-test -
[INFO] prettify.css (817b) -> prettify.css (617b)[75%]
[INFO] total input (1510b) -> output (1134b)[75%]
于 2013-11-06T23:21:00.003 回答
3

如上所述,maven-war-plugin 会覆盖 minify 插件创建的文件。这似乎无法改变。然而,想要的行为可以通过简单地改变项目结构来实现。

这里的例子是我对我的项目所做的。我正在使用minify-maven-pluginspring框架,静态文件存储在静态目录中。

1) 将静态目录从src/main/webapp移动到src/main/resources

2) 更改 pom.xml 中的 minify 插件配置。所以源指向资源,目标指向类:

<webappSourceDir>src/main/resources</webappSourceDir>
<webappTargetDir>target/classes</webappTargetDir>
<jsSourceDir>static</jsSourceDir>
<cssSourceDir>static</cssSourceDir>

3)更改弹簧配置。所以 spring 正在从类路径提供静态文件:

<mvc:resources location="classpath:/static/" mapping="/static/**"/>

现在

mvn clean && mvn package

使用 /WEB-INF/classes/static 中的缩小文件产生正确的战争

于 2013-12-18T19:54:00.130 回答
2

你应该看看Minify Maven Plugin,这听起来像是你需要的东西。
如果您需要任何帮助来配置它,请告诉我。

于 2013-11-07T01:20:34.817 回答