我正在使用Maven-yui压缩器插件和Maven-one-jar插件来创建一个容器js和css资源的jar文件。不过,我的压缩css文件似乎总是"落后一次编译",这意味着我必须编译两次应用程序才能获得css更改。这是我的构建插件的pom部分
<!-- Coffee -->
<plugin>
<groupId>com.github.iron9light</groupId>
<artifactId>coffeescript-maven-plugin</artifactId>
<version>1.1.2</version>
<configuration>
<srcDir>src/main/resources</srcDir>
<outputDir>src/main/resources</outputDir>
<bare>false</bare>
<modifiedOnly>false</modifiedOnly>
<allowedDelete>true</allowedDelete>
</configuration>
<executions>
<execution>
<id>coffeescript</id>
<phase>generate-resources</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- Sass -->
<plugin>
<groupId>org.jasig.maven</groupId>
<artifactId>sass-maven-plugin</artifactId>
<version>1.1.1</version>
<executions>
<execution>
<goals>
<goal>update-stylesheets</goal>
</goals>
</execution>
</executions>
<configuration>
<sassSourceDirectory>src/main/resources</sassSourceDirectory>
<destination>src/main/resources</destination>
</configuration>
</plugin>
<!-- YUI Compressor -->
<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>
<excludes>
<exclude>**/*.min.js</exclude>
<exclude>**/*.min.css</exclude>
</excludes>
<suffix>.min</suffix>
<outputDirectory>src/main/resources</outputDirectory>
</configuration>
</plugin>
<!-- Compiler -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<!-- Jar -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<mainClass>com.example.application.web.JettyStarter</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- One Jar -->
<plugin>
<groupId>org.dstovall</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>1.4.4</version>
<executions>
<execution>
<configuration>
<onejarVersion>0.97</onejarVersion>
<classifier>onejar</classifier>
</configuration>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
当我检查我的源代码树时,我看到缩小的css在那里,但它不在jar中。我想把这比作在一个罐子包装之前"冲洗"文件。以前有人见过这个吗?
示例:我将此添加到style.css
.clear-both {
clear: both;
}
并且在源树中的style.min.css中
.clear-both{clear:both;}
但是当我通过服务器请求这个文件时:
GET css/style.min.css
那条线不在那儿。
这可能与插件执行资源的顺序有关吗?插件:
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ MyApp ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 661 resources
[INFO]
[INFO] --- yuicompressor-maven-plugin:1.1:compress (default) @ MyApp ---
...
是的,这是因为maven-resources-plugin
是在yuicompressor-maven-plugin
之前执行的,因此缩小的文件没有复制到最终的jar中。
重新安排阶段将有助于解决此问题,但解决此问题的最佳方法是避免在源树中生成缩小/压缩/编译的文件。这些文件不应该是源代码树的一部分,而应该生成到构建的输出目录中。使用Maven的${project.build.directory}
(目标目录)进行各种操作和处理。这也将确保在maven构建(mvn-clean-install)期间始终清理所有生成的文件
看看下面的构建片段。我已在必要时提出意见。这个片段是在假设所有的coffee脚本(.coffee文件)、saas模板(.scss文件)、其他css(未压缩.css文件)、js(未压缩.js文件)和其他文件(比如图像等)都存在于src/main/resources中的情况下制作的。该片段将只打包缩小后的js和css,而未压缩的js/css不会打包到jar中。
如果您想测试这一点,请在使用此代码段执行任何maven构建之前,从src\main\resources中删除所有生成的css文件、js文件和缩小文件。
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<!-- removing coffee scripts, saas templates, js and css from the final
output,we will only allow compressed files to go into the final jar
maven-resources-plugin:resources will respect these exclusions -->
<excludes>
<exclude>**/**.coffee</exclude>
<exclude>**/**.scss</exclude>
<exclude>**/**.css</exclude>
<exclude>**/**.js</exclude>
</excludes>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<groupId>org.apache.maven.plugins</groupId>
<version>2.6</version>
<executions>
<!-- copy uncompressed css and js to a staging directory for compressing -->
<execution>
<id>copy-uncompressed-css-and-js</id>
<phase>process-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.js</include>
<include>**/*.css</include>
</includes>
</resource>
</resources>
<outputDirectory>${project.build.directory}/uncompressed-css-and-js</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<!-- Coffee -->
<!-- compiling coffee scripts and generating the uncompressed js files
into a staging directory for compressing -->
<plugin>
<groupId>com.github.iron9light</groupId>
<artifactId>coffeescript-maven-plugin</artifactId>
<version>1.1.2</version>
<configuration>
<srcDir>src/main/resources/coffee</srcDir>
<outputDir>${project.build.directory}/uncompressed-css-and-js</outputDir>
<bare>false</bare>
<modifiedOnly>false</modifiedOnly>
<allowedDelete>true</allowedDelete>
</configuration>
<executions>
<execution>
<id>coffeescript</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- Sass -->
<!-- compiling saas scripts and generating the uncompressed css files
into a staging directory for compressing -->
<plugin>
<groupId>org.jasig.maven</groupId>
<artifactId>sass-maven-plugin</artifactId>
<version>1.1.1</version>
<executions>
<execution>
<id>saas</id>
<phase>compile</phase>
<goals>
<goal>update-stylesheets</goal>
</goals>
</execution>
</executions>
<configuration>
<sassSourceDirectory>src/main/resources/saas</sassSourceDirectory>
<destination>${project.build.directory}/uncompressed-css-and-js</destination>
</configuration>
</plugin>
<!-- YUI Compressor -->
<!-- compressing all css/jss files in the staging directory and generating
the output in the target/classes folder(which will end up in the final jar -->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>yuicompressor-maven-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<id>compress</id>
<phase>process-classes</phase>
<goals>
<goal>compress</goal>
</goals>
</execution>
</executions>
<configuration>
<suffix>.min</suffix>
<sourceDirectory>${project.build.directory}/uncompressed-css-and-js</sourceDirectory>
<outputDirectory>${project.build.outputDirectory}</outputDirectory>
</configuration>
</plugin>
</plugins>
参考:查看Maven默认生命周期中各阶段的顺序
答案是将CoffeeScript、Sass和YUI压缩放入过程源阶段
<phase>process-sources</phase>