├── .gitignore
├── .mvn
└── wrapper
│ ├── MavenWrapperDownloader.java
│ ├── maven-wrapper.jar
│ └── maven-wrapper.properties
├── .travis.yml
├── CHANGELOG
├── LICENSE.txt
├── README-yuicompressor.txt
├── README.md
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
├── assembly
└── project.xml
├── it
├── demo01
│ ├── invoker.properties
│ ├── pom.xml
│ ├── src
│ │ ├── main
│ │ │ ├── resources-filtering
│ │ │ │ ├── file_rf01.js
│ │ │ │ └── file_rf02.js
│ │ │ ├── resources-redirect
│ │ │ │ ├── file_rr01.js
│ │ │ │ └── file_rr02.js
│ │ │ ├── resources
│ │ │ │ ├── file_r01.js
│ │ │ │ └── file_r02.js
│ │ │ └── webapp
│ │ │ │ ├── WEB-INF
│ │ │ │ └── web.xml
│ │ │ │ ├── index.jsp
│ │ │ │ └── static
│ │ │ │ ├── highlighter.js
│ │ │ │ ├── jquery.pack.js
│ │ │ │ ├── toAggregateAndRemove
│ │ │ │ ├── bar.js
│ │ │ │ └── foo.js
│ │ │ │ ├── uni-form-generic.css
│ │ │ │ ├── uni-form.css
│ │ │ │ ├── uni-form.jquery.js
│ │ │ │ └── zero.js
│ │ └── test
│ │ │ └── java
│ │ │ └── ResourcesTest.java
│ └── validate.groovy
└── issue19
│ ├── invoker.properties
│ ├── pom.xml
│ ├── src
│ └── main
│ │ ├── filters
│ │ └── dev.properties
│ │ └── resources
│ │ ├── file_r01.js
│ │ ├── file_r02.js
│ │ └── webapp.properties
│ └── validate.groovy
├── main
├── java
│ └── net_alchim31_maven_yuicompressor
│ │ ├── Aggregation.java
│ │ ├── BasicRhinoShell.java
│ │ ├── ErrorReporter4Mojo.java
│ │ ├── JSLintChecker.java
│ │ ├── JSLintMojo.java
│ │ ├── MojoSupport.java
│ │ ├── SourceFile.java
│ │ └── YuiCompressorMojo.java
└── resources
│ ├── META-INF
│ └── m2e
│ │ └── lifecycle-mapping-metadata.xml
│ └── jslint.js
├── site
├── default-site.vm
├── resources
│ ├── css
│ │ ├── maven-base.css
│ │ ├── maven-theme.css
│ │ ├── print.css
│ │ └── site.css
│ └── images
│ │ ├── close.gif
│ │ ├── collapsed.gif
│ │ ├── expanded.gif
│ │ ├── external.png
│ │ ├── icon_error_sml.gif
│ │ ├── icon_info_sml.gif
│ │ ├── icon_success_sml.gif
│ │ ├── icon_warning_sml.gif
│ │ ├── logos
│ │ ├── build-by-maven-black.png
│ │ ├── build-by-maven-white.png
│ │ └── maven-feather.png
│ │ └── newwindow.png
├── site.xml
├── template-site.vm
└── xdoc
│ ├── ex_aggregation.xml
│ ├── ex_failOnWarning.xml
│ ├── ex_gzip.xml
│ ├── index.xml.vm
│ ├── links.xml
│ ├── usage_compress.xml
│ └── usage_jslint.xml
└── test
└── java
└── net_alchim31_maven_yuicompressor
└── AggregationTestCase.java
/.gitignore:
--------------------------------------------------------------------------------
1 | # use glob syntax.
2 | syntax: glob
3 | *.ser
4 | *.class
5 | *~
6 | *.bak
7 | *.off
8 | *.old
9 |
10 | # eclipse conf file
11 | .settings
12 | .classpath
13 | .project
14 | .manager
15 |
16 | # idea
17 | *.iml
18 | *.iws
19 | *.ipr
20 | .idea
21 |
22 | # building
23 | target
24 | build
25 | null
26 | tmp*
27 | temp
28 | dist
29 | test-output
30 | build.log
31 |
32 | # other scm
33 | .svn
34 | .CVS
35 | .hg*
36 |
37 | # switch to regexp syntax.
38 | # syntax: regexp
39 | # ^\.pc/
40 |
41 |
42 | /pom.xml.releaseBackup
43 | /release.properties
44 |
--------------------------------------------------------------------------------
/.mvn/wrapper/MavenWrapperDownloader.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2007-present the original author or authors.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 | import java.net.*;
17 | import java.io.*;
18 | import java.nio.channels.*;
19 | import java.util.Properties;
20 |
21 | public class MavenWrapperDownloader {
22 |
23 | private static final String WRAPPER_VERSION = "0.5.5";
24 | /**
25 | * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
26 | */
27 | private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
28 | + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
29 |
30 | /**
31 | * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
32 | * use instead of the default one.
33 | */
34 | private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
35 | ".mvn/wrapper/maven-wrapper.properties";
36 |
37 | /**
38 | * Path where the maven-wrapper.jar will be saved to.
39 | */
40 | private static final String MAVEN_WRAPPER_JAR_PATH =
41 | ".mvn/wrapper/maven-wrapper.jar";
42 |
43 | /**
44 | * Name of the property which should be used to override the default download url for the wrapper.
45 | */
46 | private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
47 |
48 | public static void main(String args[]) {
49 | System.out.println("- Downloader started");
50 | File baseDirectory = new File(args[0]);
51 | System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
52 |
53 | // If the maven-wrapper.properties exists, read it and check if it contains a custom
54 | // wrapperUrl parameter.
55 | File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
56 | String url = DEFAULT_DOWNLOAD_URL;
57 | if(mavenWrapperPropertyFile.exists()) {
58 | FileInputStream mavenWrapperPropertyFileInputStream = null;
59 | try {
60 | mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
61 | Properties mavenWrapperProperties = new Properties();
62 | mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
63 | url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
64 | } catch (IOException e) {
65 | System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
66 | } finally {
67 | try {
68 | if(mavenWrapperPropertyFileInputStream != null) {
69 | mavenWrapperPropertyFileInputStream.close();
70 | }
71 | } catch (IOException e) {
72 | // Ignore ...
73 | }
74 | }
75 | }
76 | System.out.println("- Downloading from: " + url);
77 |
78 | File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
79 | if(!outputFile.getParentFile().exists()) {
80 | if(!outputFile.getParentFile().mkdirs()) {
81 | System.out.println(
82 | "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
83 | }
84 | }
85 | System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
86 | try {
87 | downloadFileFromURL(url, outputFile);
88 | System.out.println("Done");
89 | System.exit(0);
90 | } catch (Throwable e) {
91 | System.out.println("- Error downloading");
92 | e.printStackTrace();
93 | System.exit(1);
94 | }
95 | }
96 |
97 | private static void downloadFileFromURL(String urlString, File destination) throws Exception {
98 | if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
99 | String username = System.getenv("MVNW_USERNAME");
100 | char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
101 | Authenticator.setDefault(new Authenticator() {
102 | @Override
103 | protected PasswordAuthentication getPasswordAuthentication() {
104 | return new PasswordAuthentication(username, password);
105 | }
106 | });
107 | }
108 | URL website = new URL(urlString);
109 | ReadableByteChannel rbc;
110 | rbc = Channels.newChannel(website.openStream());
111 | FileOutputStream fos = new FileOutputStream(destination);
112 | fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
113 | fos.close();
114 | rbc.close();
115 | }
116 |
117 | }
118 |
--------------------------------------------------------------------------------
/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/davidB/yuicompressor-maven-plugin/175bbbdde555f6e6eb4419f352818849da4f8665/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip
2 | wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar
3 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: java
2 | sudo: false # faster builds
3 | jdk:
4 | - openjdk8
5 | cache:
6 | directories:
7 | - $HOME/.gradle/caches/
8 | - $HOME/.gradle/wrapper/
9 | - $HOME/.m2/repository/
10 |
11 | script: "./mvnw package integration-test javadoc:jar site"
12 |
13 |
--------------------------------------------------------------------------------
/CHANGELOG:
--------------------------------------------------------------------------------
1 |
2 | 1.3.1
3 | --------------------
4 |
5 | + Upgraded YUI Compressor to version 2.4.7 with following changes:
6 | + Handle data urls without blowing up Java memory (regex)
7 | + Updated docs to reflect Java >= 1.5 required for CssCompressor
8 | + Fixed issue where we were breaking #AABBCC id selectors, with the #AABBCC -> #ABC color compression.
9 |
10 | + Changed default value for linebreakpos to -1, as currently default 0 have a special meaning (Fixed #31)
11 |
12 | YUI Compressor README:
13 | Some source control tools don't like files containing lines longer than,
14 | say 8000 characters. The linebreak option is used in that case to split
15 | long lines after a specific column. It can also be used to make the code
16 | more readable, easier to debug (especially with the MS Script Debugger)
17 | Specify 0 to get a line break after each semi-colon in JavaScript, and
18 | after each rule in CSS.
19 |
20 | + Added detailed CHANGELOG
--------------------------------------------------------------------------------
/README-yuicompressor.txt:
--------------------------------------------------------------------------------
1 | ==============================================================================
2 | YUI Compressor
3 | ==============================================================================
4 |
5 | NAME
6 |
7 | YUI Compressor - The Yahoo! JavaScript and CSS Compressor
8 |
9 | SYNOPSIS
10 |
11 | Usage: java -jar yuicompressor-x.y.z.jar [options] [input file]
12 |
13 | Global Options
14 | -h, --help Displays this information
15 | --type Specifies the type of the input file
16 | --charset Read the input file using
17 | --line-break Insert a line break after the specified column number
18 | -v, --verbose Display informational messages and warnings
19 | -o Place the output into or a file pattern.
20 | Defaults to stdout.
21 |
22 | JavaScript Options
23 | --nomunge Minify only, do not obfuscate
24 | --preserve-semi Preserve all semicolons
25 | --disable-optimizations Disable all micro optimizations
26 |
27 | DESCRIPTION
28 |
29 | The YUI Compressor is a JavaScript compressor which, in addition to removing
30 | comments and white-spaces, obfuscates local variables using the smallest
31 | possible variable name. This obfuscation is safe, even when using constructs
32 | such as 'eval' or 'with' (although the compression is not optimal is those
33 | cases) Compared to jsmin, the average savings is around 20%.
34 |
35 | The YUI Compressor is also able to safely compress CSS files. The decision
36 | on which compressor is being used is made on the file extension (js or css)
37 |
38 | GLOBAL OPTIONS
39 |
40 | -h, --help
41 | Prints help on how to use the YUI Compressor
42 |
43 | --line-break
44 | Some source control tools don't like files containing lines longer than,
45 | say 8000 characters. The linebreak option is used in that case to split
46 | long lines after a specific column. It can also be used to make the code
47 | more readable, easier to debug (especially with the MS Script Debugger)
48 | Specify 0 to get a line break after each semi-colon in JavaScript, and
49 | after each rule in CSS.
50 |
51 | --type js|css
52 | The type of compressor (JavaScript or CSS) is chosen based on the
53 | extension of the input file name (.js or .css) This option is required
54 | if no input file has been specified. Otherwise, this option is only
55 | required if the input file extension is neither 'js' nor 'css'.
56 |
57 | --charset character-set
58 | If a supported character set is specified, the YUI Compressor will use it
59 | to read the input file. Otherwise, it will assume that the platform's
60 | default character set is being used. The output file is encoded using
61 | the same character set.
62 |
63 | -o outfile
64 |
65 | Place output in file outfile. If not specified, the YUI Compressor will
66 | default to the standard output, which you can redirect to a file.
67 | Supports a filter syntax for expressing the output pattern when there are
68 | multiple input files. ex:
69 | java -jar yuicompressor.jar -o '.css$:-min.css' *.css
70 | ... will minify all .css files and save them as -min.css
71 |
72 | -v, --verbose
73 | Display informational messages and warnings.
74 |
75 | JAVASCRIPT ONLY OPTIONS
76 |
77 | --nomunge
78 | Minify only. Do not obfuscate local symbols.
79 |
80 | --preserve-semi
81 | Preserve unnecessary semicolons (such as right before a '}') This option
82 | is useful when compressed code has to be run through JSLint (which is the
83 | case of YUI for example)
84 |
85 | --disable-optimizations
86 | Disable all the built-in micro optimizations.
87 |
88 | NOTES
89 |
90 | + If no input file is specified, it defaults to stdin.
91 |
92 | + Supports wildcards for specifying multiple input files.
93 |
94 | + The YUI Compressor requires Java version >= 1.5.
95 |
96 | + It is possible to prevent a local variable, nested function or function
97 | argument from being obfuscated by using "hints". A hint is a string that
98 | is located at the very beginning of a function body like so:
99 |
100 | function fn (arg1, arg2, arg3) {
101 | "arg2:nomunge, localVar:nomunge, nestedFn:nomunge";
102 |
103 | ...
104 | var localVar;
105 | ...
106 |
107 | function nestedFn () {
108 | ....
109 | }
110 |
111 | ...
112 | }
113 |
114 | The hint itself disappears from the compressed file.
115 |
116 | + C-style comments starting with /*! are preserved. This is useful with
117 | comments containing copyright/license information. For example:
118 |
119 | /*!
120 | * TERMS OF USE - EASING EQUATIONS
121 | * Open source under the BSD License.
122 | * Copyright 2001 Robert Penner All rights reserved.
123 | */
124 |
125 | becomes:
126 |
127 | /*
128 | * TERMS OF USE - EASING EQUATIONS
129 | * Open source under the BSD License.
130 | * Copyright 2001 Robert Penner All rights reserved.
131 | */
132 |
133 | MODIFIED RHINO FILES
134 |
135 | YUI Compressor uses a modified version of the Rhino library
136 | (http://www.mozilla.org/rhino/) The changes were made to support
137 | JScript conditional comments, preserved comments, unescaped slash
138 | characters in regular expressions, and to allow for the optimization
139 | of escaped quotes in string literals.
140 |
141 | COPYRIGHT AND LICENSE
142 |
143 | Copyright (c) 2011 Yahoo! Inc. All rights reserved.
144 | The copyrights embodied in the content of this file are licensed
145 | by Yahoo! Inc. under the BSD (revised) open source license.
146 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # YUICompressor-maven-plugin
2 |
3 | [](https://travis-ci.com/davidB/yuicompressor-maven-plugin)
4 |
5 | ## Overview
6 |
7 | Maven's plugin to compress (minify/obfuscate/aggregate) JavaScript and CSS files using [YUI Compressor](http://developer.yahoo.com/yui/compressor/)
8 |
9 | ## Documentation
10 |
11 | Full documentation is available under following link: http://davidb.github.com/yuicompressor-maven-plugin/
12 |
13 | Summary of the project history can be found in [CHANGELOG](https://github.com/davidB/yuicompressor-maven-plugin/blob/master/CHANGELOG)
14 |
15 | ## Build
16 |
17 | * `./mvnw package` : generate jar
18 | * `./mvnw site` : generate the plugin website
19 | * `./mvnw integration-test` : `./mvnw package` + run all integration test
20 | * `./mvnw integration-test -Dinvoker.test=demo01` : run integration test 'demo01' (against all configuration) useful for tuning/debug
21 | * `./mvnw install` : `./mvnw integration-test` + publish on local maven repository
22 | * `./mvnw install -Dmaven.test.skip=true` : ./mvnw install` without run of unit test and run of integration test
23 | * release :
24 | * `gpg --use-agent --armor --detach-sign --output $(mktemp) pom.xml` to avoid issue on macosx with gpg signature see [[MGPG-59] GPG Plugin: "gpg: signing failed: Inap
25 | propriate ioctl for device" - ASF JIRA](https://issues.apache.org/jira/browse/MGPG-59)
26 | * `./mvnw release:clean && ./mvnw release:prepare && ./mvnw release:perform` : to publish on staging repository via plugin
27 | * `./mvnw release:clean && ./mvnw release:prepare -Darguments="-DskipTests -Dmaven.test.skip=true" && ./mvnw release:perform -Darguments="-DskipTests -Dmaven.test.skip=true"` to publish without tests
28 | * `./mvnw site package source:jar javadoc:jar install:install gpg:sign deploy:deploy changes:announcement-generate -Dmaven.test.skip=true -DperformRelease=true` : man
29 | ual
30 | * connect to http://oss.sonatype.org/ close and release the request(about yuicompressor-maven-plugin) in staging repositories
31 | * browse the updated [mvnsite](https://davidb.github.io/yuicompressor-maven-plugin/) (check version into samples, ...)
32 |
33 | ## Issues
34 |
35 | Found a bug? Have an idea? Report it to the [issue tracker](https://github.com/davidB/yuicompressor-maven-plugin/issues?state=open)
36 |
37 |
38 | ## Developers
39 |
40 | * [David Bernard](https://github.com/davidB)
41 | * [Piotr Kuczynski](https://github.com/pkuczynski)
42 |
43 |
44 | ## License
45 |
46 | This project is available under the [Creative Commons GNU LGPL, Version 2.1](http://creativecommons.org/licenses/LGPL/2.1/).
47 |
--------------------------------------------------------------------------------
/mvnw:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | # ----------------------------------------------------------------------------
3 | # Licensed to the Apache Software Foundation (ASF) under one
4 | # or more contributor license agreements. See the NOTICE file
5 | # distributed with this work for additional information
6 | # regarding copyright ownership. The ASF licenses this file
7 | # to you under the Apache License, Version 2.0 (the
8 | # "License"); you may not use this file except in compliance
9 | # with the License. You may obtain a copy of the License at
10 | #
11 | # http://www.apache.org/licenses/LICENSE-2.0
12 | #
13 | # Unless required by applicable law or agreed to in writing,
14 | # software distributed under the License is distributed on an
15 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 | # KIND, either express or implied. See the License for the
17 | # specific language governing permissions and limitations
18 | # under the License.
19 | # ----------------------------------------------------------------------------
20 |
21 | # ----------------------------------------------------------------------------
22 | # Maven2 Start Up Batch script
23 | #
24 | # Required ENV vars:
25 | # ------------------
26 | # JAVA_HOME - location of a JDK home dir
27 | #
28 | # Optional ENV vars
29 | # -----------------
30 | # M2_HOME - location of maven2's installed home dir
31 | # MAVEN_OPTS - parameters passed to the Java VM when running Maven
32 | # e.g. to debug Maven itself, use
33 | # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
34 | # MAVEN_SKIP_RC - flag to disable loading of mavenrc files
35 | # ----------------------------------------------------------------------------
36 |
37 | if [ -z "$MAVEN_SKIP_RC" ] ; then
38 |
39 | if [ -f /etc/mavenrc ] ; then
40 | . /etc/mavenrc
41 | fi
42 |
43 | if [ -f "$HOME/.mavenrc" ] ; then
44 | . "$HOME/.mavenrc"
45 | fi
46 |
47 | fi
48 |
49 | # OS specific support. $var _must_ be set to either true or false.
50 | cygwin=false;
51 | darwin=false;
52 | mingw=false
53 | case "`uname`" in
54 | CYGWIN*) cygwin=true ;;
55 | MINGW*) mingw=true;;
56 | Darwin*) darwin=true
57 | # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
58 | # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
59 | if [ -z "$JAVA_HOME" ]; then
60 | if [ -x "/usr/libexec/java_home" ]; then
61 | export JAVA_HOME="`/usr/libexec/java_home`"
62 | else
63 | export JAVA_HOME="/Library/Java/Home"
64 | fi
65 | fi
66 | ;;
67 | esac
68 |
69 | if [ -z "$JAVA_HOME" ] ; then
70 | if [ -r /etc/gentoo-release ] ; then
71 | JAVA_HOME=`java-config --jre-home`
72 | fi
73 | fi
74 |
75 | if [ -z "$M2_HOME" ] ; then
76 | ## resolve links - $0 may be a link to maven's home
77 | PRG="$0"
78 |
79 | # need this for relative symlinks
80 | while [ -h "$PRG" ] ; do
81 | ls=`ls -ld "$PRG"`
82 | link=`expr "$ls" : '.*-> \(.*\)$'`
83 | if expr "$link" : '/.*' > /dev/null; then
84 | PRG="$link"
85 | else
86 | PRG="`dirname "$PRG"`/$link"
87 | fi
88 | done
89 |
90 | saveddir=`pwd`
91 |
92 | M2_HOME=`dirname "$PRG"`/..
93 |
94 | # make it fully qualified
95 | M2_HOME=`cd "$M2_HOME" && pwd`
96 |
97 | cd "$saveddir"
98 | # echo Using m2 at $M2_HOME
99 | fi
100 |
101 | # For Cygwin, ensure paths are in UNIX format before anything is touched
102 | if $cygwin ; then
103 | [ -n "$M2_HOME" ] &&
104 | M2_HOME=`cygpath --unix "$M2_HOME"`
105 | [ -n "$JAVA_HOME" ] &&
106 | JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
107 | [ -n "$CLASSPATH" ] &&
108 | CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
109 | fi
110 |
111 | # For Mingw, ensure paths are in UNIX format before anything is touched
112 | if $mingw ; then
113 | [ -n "$M2_HOME" ] &&
114 | M2_HOME="`(cd "$M2_HOME"; pwd)`"
115 | [ -n "$JAVA_HOME" ] &&
116 | JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
117 | fi
118 |
119 | if [ -z "$JAVA_HOME" ]; then
120 | javaExecutable="`which javac`"
121 | if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
122 | # readlink(1) is not available as standard on Solaris 10.
123 | readLink=`which readlink`
124 | if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
125 | if $darwin ; then
126 | javaHome="`dirname \"$javaExecutable\"`"
127 | javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
128 | else
129 | javaExecutable="`readlink -f \"$javaExecutable\"`"
130 | fi
131 | javaHome="`dirname \"$javaExecutable\"`"
132 | javaHome=`expr "$javaHome" : '\(.*\)/bin'`
133 | JAVA_HOME="$javaHome"
134 | export JAVA_HOME
135 | fi
136 | fi
137 | fi
138 |
139 | if [ -z "$JAVACMD" ] ; then
140 | if [ -n "$JAVA_HOME" ] ; then
141 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
142 | # IBM's JDK on AIX uses strange locations for the executables
143 | JAVACMD="$JAVA_HOME/jre/sh/java"
144 | else
145 | JAVACMD="$JAVA_HOME/bin/java"
146 | fi
147 | else
148 | JAVACMD="`which java`"
149 | fi
150 | fi
151 |
152 | if [ ! -x "$JAVACMD" ] ; then
153 | echo "Error: JAVA_HOME is not defined correctly." >&2
154 | echo " We cannot execute $JAVACMD" >&2
155 | exit 1
156 | fi
157 |
158 | if [ -z "$JAVA_HOME" ] ; then
159 | echo "Warning: JAVA_HOME environment variable is not set."
160 | fi
161 |
162 | CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
163 |
164 | # traverses directory structure from process work directory to filesystem root
165 | # first directory with .mvn subdirectory is considered project base directory
166 | find_maven_basedir() {
167 |
168 | if [ -z "$1" ]
169 | then
170 | echo "Path not specified to find_maven_basedir"
171 | return 1
172 | fi
173 |
174 | basedir="$1"
175 | wdir="$1"
176 | while [ "$wdir" != '/' ] ; do
177 | if [ -d "$wdir"/.mvn ] ; then
178 | basedir=$wdir
179 | break
180 | fi
181 | # workaround for JBEAP-8937 (on Solaris 10/Sparc)
182 | if [ -d "${wdir}" ]; then
183 | wdir=`cd "$wdir/.."; pwd`
184 | fi
185 | # end of workaround
186 | done
187 | echo "${basedir}"
188 | }
189 |
190 | # concatenates all lines of a file
191 | concat_lines() {
192 | if [ -f "$1" ]; then
193 | echo "$(tr -s '\n' ' ' < "$1")"
194 | fi
195 | }
196 |
197 | BASE_DIR=`find_maven_basedir "$(pwd)"`
198 | if [ -z "$BASE_DIR" ]; then
199 | exit 1;
200 | fi
201 |
202 | ##########################################################################################
203 | # Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
204 | # This allows using the maven wrapper in projects that prohibit checking in binary data.
205 | ##########################################################################################
206 | if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
207 | if [ "$MVNW_VERBOSE" = true ]; then
208 | echo "Found .mvn/wrapper/maven-wrapper.jar"
209 | fi
210 | else
211 | if [ "$MVNW_VERBOSE" = true ]; then
212 | echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
213 | fi
214 | if [ -n "$MVNW_REPOURL" ]; then
215 | jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
216 | else
217 | jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
218 | fi
219 | while IFS="=" read key value; do
220 | case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
221 | esac
222 | done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
223 | if [ "$MVNW_VERBOSE" = true ]; then
224 | echo "Downloading from: $jarUrl"
225 | fi
226 | wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
227 | if $cygwin; then
228 | wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
229 | fi
230 |
231 | if command -v wget > /dev/null; then
232 | if [ "$MVNW_VERBOSE" = true ]; then
233 | echo "Found wget ... using wget"
234 | fi
235 | if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
236 | wget "$jarUrl" -O "$wrapperJarPath"
237 | else
238 | wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
239 | fi
240 | elif command -v curl > /dev/null; then
241 | if [ "$MVNW_VERBOSE" = true ]; then
242 | echo "Found curl ... using curl"
243 | fi
244 | if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
245 | curl -o "$wrapperJarPath" "$jarUrl" -f
246 | else
247 | curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
248 | fi
249 |
250 | else
251 | if [ "$MVNW_VERBOSE" = true ]; then
252 | echo "Falling back to using Java to download"
253 | fi
254 | javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
255 | # For Cygwin, switch paths to Windows format before running javac
256 | if $cygwin; then
257 | javaClass=`cygpath --path --windows "$javaClass"`
258 | fi
259 | if [ -e "$javaClass" ]; then
260 | if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
261 | if [ "$MVNW_VERBOSE" = true ]; then
262 | echo " - Compiling MavenWrapperDownloader.java ..."
263 | fi
264 | # Compiling the Java class
265 | ("$JAVA_HOME/bin/javac" "$javaClass")
266 | fi
267 | if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
268 | # Running the downloader
269 | if [ "$MVNW_VERBOSE" = true ]; then
270 | echo " - Running MavenWrapperDownloader.java ..."
271 | fi
272 | ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
273 | fi
274 | fi
275 | fi
276 | fi
277 | ##########################################################################################
278 | # End of extension
279 | ##########################################################################################
280 |
281 | export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
282 | if [ "$MVNW_VERBOSE" = true ]; then
283 | echo $MAVEN_PROJECTBASEDIR
284 | fi
285 | MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
286 |
287 | # For Cygwin, switch paths to Windows format before running java
288 | if $cygwin; then
289 | [ -n "$M2_HOME" ] &&
290 | M2_HOME=`cygpath --path --windows "$M2_HOME"`
291 | [ -n "$JAVA_HOME" ] &&
292 | JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
293 | [ -n "$CLASSPATH" ] &&
294 | CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
295 | [ -n "$MAVEN_PROJECTBASEDIR" ] &&
296 | MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
297 | fi
298 |
299 | # Provide a "standardized" way to retrieve the CLI args that will
300 | # work with both Windows and non-Windows executions.
301 | MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
302 | export MAVEN_CMD_LINE_ARGS
303 |
304 | WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
305 |
306 | exec "$JAVACMD" \
307 | $MAVEN_OPTS \
308 | -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
309 | "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
310 | ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
311 |
--------------------------------------------------------------------------------
/mvnw.cmd:
--------------------------------------------------------------------------------
1 | @REM ----------------------------------------------------------------------------
2 | @REM Licensed to the Apache Software Foundation (ASF) under one
3 | @REM or more contributor license agreements. See the NOTICE file
4 | @REM distributed with this work for additional information
5 | @REM regarding copyright ownership. The ASF licenses this file
6 | @REM to you under the Apache License, Version 2.0 (the
7 | @REM "License"); you may not use this file except in compliance
8 | @REM with the License. You may obtain a copy of the License at
9 | @REM
10 | @REM http://www.apache.org/licenses/LICENSE-2.0
11 | @REM
12 | @REM Unless required by applicable law or agreed to in writing,
13 | @REM software distributed under the License is distributed on an
14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 | @REM KIND, either express or implied. See the License for the
16 | @REM specific language governing permissions and limitations
17 | @REM under the License.
18 | @REM ----------------------------------------------------------------------------
19 |
20 | @REM ----------------------------------------------------------------------------
21 | @REM Maven2 Start Up Batch script
22 | @REM
23 | @REM Required ENV vars:
24 | @REM JAVA_HOME - location of a JDK home dir
25 | @REM
26 | @REM Optional ENV vars
27 | @REM M2_HOME - location of maven2's installed home dir
28 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
29 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
30 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
31 | @REM e.g. to debug Maven itself, use
32 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
33 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
34 | @REM ----------------------------------------------------------------------------
35 |
36 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
37 | @echo off
38 | @REM set title of command window
39 | title %0
40 | @REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
41 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
42 |
43 | @REM set %HOME% to equivalent of $HOME
44 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
45 |
46 | @REM Execute a user defined script before this one
47 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
48 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending
49 | if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
50 | if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
51 | :skipRcPre
52 |
53 | @setlocal
54 |
55 | set ERROR_CODE=0
56 |
57 | @REM To isolate internal variables from possible post scripts, we use another setlocal
58 | @setlocal
59 |
60 | @REM ==== START VALIDATION ====
61 | if not "%JAVA_HOME%" == "" goto OkJHome
62 |
63 | echo.
64 | echo Error: JAVA_HOME not found in your environment. >&2
65 | echo Please set the JAVA_HOME variable in your environment to match the >&2
66 | echo location of your Java installation. >&2
67 | echo.
68 | goto error
69 |
70 | :OkJHome
71 | if exist "%JAVA_HOME%\bin\java.exe" goto init
72 |
73 | echo.
74 | echo Error: JAVA_HOME is set to an invalid directory. >&2
75 | echo JAVA_HOME = "%JAVA_HOME%" >&2
76 | echo Please set the JAVA_HOME variable in your environment to match the >&2
77 | echo location of your Java installation. >&2
78 | echo.
79 | goto error
80 |
81 | @REM ==== END VALIDATION ====
82 |
83 | :init
84 |
85 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
86 | @REM Fallback to current working directory if not found.
87 |
88 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
89 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
90 |
91 | set EXEC_DIR=%CD%
92 | set WDIR=%EXEC_DIR%
93 | :findBaseDir
94 | IF EXIST "%WDIR%"\.mvn goto baseDirFound
95 | cd ..
96 | IF "%WDIR%"=="%CD%" goto baseDirNotFound
97 | set WDIR=%CD%
98 | goto findBaseDir
99 |
100 | :baseDirFound
101 | set MAVEN_PROJECTBASEDIR=%WDIR%
102 | cd "%EXEC_DIR%"
103 | goto endDetectBaseDir
104 |
105 | :baseDirNotFound
106 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
107 | cd "%EXEC_DIR%"
108 |
109 | :endDetectBaseDir
110 |
111 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
112 |
113 | @setlocal EnableExtensions EnableDelayedExpansion
114 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
115 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
116 |
117 | :endReadAdditionalConfig
118 |
119 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
120 | set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
121 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
122 |
123 | set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
124 |
125 | FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
126 | IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
127 | )
128 |
129 | @REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
130 | @REM This allows using the maven wrapper in projects that prohibit checking in binary data.
131 | if exist %WRAPPER_JAR% (
132 | if "%MVNW_VERBOSE%" == "true" (
133 | echo Found %WRAPPER_JAR%
134 | )
135 | ) else (
136 | if not "%MVNW_REPOURL%" == "" (
137 | SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
138 | )
139 | if "%MVNW_VERBOSE%" == "true" (
140 | echo Couldn't find %WRAPPER_JAR%, downloading it ...
141 | echo Downloading from: %DOWNLOAD_URL%
142 | )
143 |
144 | powershell -Command "&{"^
145 | "$webclient = new-object System.Net.WebClient;"^
146 | "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
147 | "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
148 | "}"^
149 | "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
150 | "}"
151 | if "%MVNW_VERBOSE%" == "true" (
152 | echo Finished downloading %WRAPPER_JAR%
153 | )
154 | )
155 | @REM End of extension
156 |
157 | @REM Provide a "standardized" way to retrieve the CLI args that will
158 | @REM work with both Windows and non-Windows executions.
159 | set MAVEN_CMD_LINE_ARGS=%*
160 |
161 | %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
162 | if ERRORLEVEL 1 goto error
163 | goto end
164 |
165 | :error
166 | set ERROR_CODE=1
167 |
168 | :end
169 | @endlocal & set ERROR_CODE=%ERROR_CODE%
170 |
171 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
172 | @REM check for post script, once with legacy .bat ending and once with .cmd ending
173 | if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
174 | if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
175 | :skipRcPost
176 |
177 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
178 | if "%MAVEN_BATCH_PAUSE%" == "on" pause
179 |
180 | if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
181 |
182 | exit /B %ERROR_CODE%
183 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 | 4.0.0
3 | net.alchim31.maven
4 | yuicompressor-maven-plugin
5 | 1.5.2-SNAPSHOT
6 | maven-plugin
7 |
8 | YUI Compressor Maven Mojo
9 |
10 | To compress (Minify + Ofuscate) Javascript files and CSS
11 | files (using YUI Compressor from Julien Lecomte) and/or to check
12 | Javascript files with jslint.
13 |
14 | http://github.com/davidB/${project.artifactId}
15 | 2012
16 |
17 |
18 | Public domain (Unlicense)
19 | http://unlicense.org/
20 | repo
21 |
22 |
23 |
24 |
25 | scm:git:git://github.com/davidB/${project.artifactId}.git
26 | scm:git:git@github.com:davidB/${project.artifactId}.git
27 | https://github.com/davidB/${project.artifactId}/
28 | HEAD
29 |
30 |
31 |
32 | github
33 | http://github.com/davidB/${project.artifactId}/issues#issue/
34 |
35 |
36 |
37 |
38 | david.bernard
39 | David Bernard
40 | +1
41 |
42 | Developer
43 |
44 |
45 |
46 |
47 |
48 |
49 | Piotr Kuczynski
50 | piotr.kuczynski@gmail.com
51 |
52 | Contributor
53 |
54 | +1
55 |
56 |
57 | Dave Hughes
58 | dlh3@sfu.ca
59 |
60 | Contributor
61 |
62 | -8
63 |
64 |
65 | Aneesh Joseph
66 | admin@coderplus.com
67 |
68 | Contributor
69 |
70 | +5.5
71 |
72 |
73 |
74 |
75 |
76 |
77 | sonatype-nexus-staging
78 | Nexus Release Repository
79 | https://oss.sonatype.org/service/local/staging/deploy/maven2/
80 |
81 |
82 | sonatype-nexus-snapshots
83 | Sonatype Nexus Snapshots
84 | https://oss.sonatype.org/content/repositories/snapshots/
85 |
86 |
87 |
88 | UTF-8
89 | github
90 | 1.8
91 | 1.8
92 | 3.0
93 | 3.3.9
94 | ${encoding}
95 | https://oss.sonatype.org/content/repositories/snapshots/
96 |
97 | target/velocity.log
98 | 3.0
99 |
100 |
101 |
102 | ${maven.version}
103 |
104 |
105 |
114 |
115 |
116 |
117 | com.yahoo.platform.yui
118 | yuicompressor
119 |
120 |
121 | 2.4.7
122 |
123 |
124 | org.apache.maven
125 | maven-plugin-api
126 | ${maven.version}
127 | provided
128 |
129 |
130 | org.apache.maven
131 | maven-core
132 | ${maven.version}
133 | provided
134 |
135 |
136 | junit
137 | junit
138 | 4.12
139 | test
140 |
141 |
142 | org.sonatype.plexus
143 | plexus-build-api
144 | 0.0.7
145 |
146 |
147 |
148 |
149 |
150 | false
151 |
152 |
153 | true
154 |
155 | sonatype-nexus-snapshots
156 | Sonatype Nexus Snapshots
157 | https://oss.sonatype.org/content/repositories/snapshots
158 |
159 |
160 |
161 | false
162 |
163 | central
164 | Central Repository
165 | https://repo.maven.apache.org/maven2
166 |
167 |
168 |
169 |
170 |
171 | never
172 |
173 |
174 | false
175 |
176 | central
177 | Central Repository
178 | https://repo.maven.apache.org/maven2
179 |
180 |
181 |
182 |
183 |
184 |
185 | maven-changes-plugin
186 | 2.9
187 |
188 |
189 | maven-release-plugin
190 | 2.5.3
191 |
192 |
193 | maven-site-plugin
194 | 3.8.2
195 |
196 |
197 | maven-jxr-plugin
198 | 3.0.0
199 |
200 |
201 | org.codehaus.mojo
202 | taglist-maven-plugin
203 | 2.4
204 |
205 |
206 | maven-plugin-plugin
207 | 3.6.0
208 |
209 |
210 | maven-project-info-reports-plugin
211 | 3.0.0
212 |
213 |
214 | maven-deploy-plugin
215 | 2.8.2
216 |
217 |
218 | maven-install-plugin
219 | 2.5.2
220 |
221 |
222 | maven-source-plugin
223 | 3.1.0
224 |
225 |
226 | maven-javadoc-plugin
227 | 3.1.1
228 |
229 | 128m
230 | 512m
231 | true
232 | ${encoding}
233 | ${encoding}
234 | ${encoding}
235 | true
236 | true
237 | true
238 | true
239 | true
240 | false
241 | -missing
242 |
243 | http://java.sun.com/j2se/${maven.compiler.source}/docs/api/
244 | http://slf4j.org/api/
245 | http://commons.apache.org/lang/api-release/
246 | http://commons.apache.org/io/api-release/
247 | http://junit.sourceforge.net/javadoc/
248 |
249 |
250 |
251 |
252 | ${project.groupId}.example*:${project.groupId}.util.internal*
253 |
254 |
255 |
256 |
257 |
258 |
259 | maven-site-plugin
260 | 3.8.2
261 |
262 |
263 | default-site
264 | site
265 |
266 | site
267 |
268 |
269 |
270 | default-deploy
271 | site-deploy
272 |
273 | deploy
274 |
275 |
276 |
277 |
278 | ${basedir}/src/site/template-site.vm
279 |
280 |
281 |
282 | maven-javadoc-plugin
283 |
284 |
285 | attach-javadocs
286 |
287 | jar
288 |
289 |
290 |
291 |
292 |
293 |
294 | org.codehaus.mojo
295 | animal-sniffer-maven-plugin
296 | 1.18
297 |
298 |
299 | org.codehaus.mojo.signature
300 | java18
301 | 1.0
302 |
303 |
304 |
305 |
306 | org.apache.maven.plugins
307 | maven-changes-plugin
308 |
309 | announcement.md.vm
310 | announcements
311 |
312 | David Bernard
313 | david.bernard.31@gmail.com
314 |
315 |
316 |
317 |
318 | org.sonatype.plugins
319 | nexus-staging-maven-plugin
320 | 1.6.8
321 | true
322 |
323 | sonatype-nexus-snapshots
324 | https://oss.sonatype.org/
325 | false
326 |
327 |
328 |
329 | maven-release-plugin
330 | 2.5.3
331 |
332 |
333 | org.apache.maven.scm
334 | maven-scm-api
335 | 1.11.2
336 | compile
337 |
338 |
339 | org.apache.maven.scm
340 | maven-scm-provider-gitexe
341 | 1.11.2
342 | compile
343 |
344 |
345 |
346 | release
347 | install animal-sniffer:check site deploy nexus-staging:release
348 | false
349 | true
350 |
351 |
352 |
353 |
354 |
355 |
356 |
357 | org.apache.maven.plugins
358 | maven-plugin-plugin
359 |
360 |
361 | org.apache.maven.plugins
362 | maven-project-info-reports-plugin
363 |
364 |
365 | org.apache.maven.plugins
366 | maven-javadoc-plugin
367 |
368 |
369 | org.apache.maven.plugins
370 | maven-jxr-plugin
371 |
372 |
373 | org.codehaus.mojo
374 | taglist-maven-plugin
375 |
376 |
377 | TODO
378 | FIXME
379 | @todo
380 | @deprecated
381 |
382 |
383 |
384 |
385 | maven-changes-plugin
386 |
387 |
388 |
389 | changes-report
390 |
391 |
392 |
393 |
394 |
395 |
396 |
397 |
398 | integration-tests
399 |
400 |
401 | maven.test.skip
402 | !true
403 |
404 |
405 |
406 |
407 |
408 | maven-invoker-plugin
409 |
410 |
411 |
412 | false
413 | true
414 | src/it
415 |
416 | **/pom.xml
417 |
418 | setup.groovy
419 | validate.groovy
420 |
421 |
422 |
423 | integration-test
424 |
425 | install
426 | run
427 |
428 |
429 |
430 |
431 |
432 |
433 |
434 |
435 | release
436 |
437 |
438 | performRelease
439 | true
440 |
441 |
442 |
443 |
444 |
445 | maven-gpg-plugin
446 | 1.6
447 |
448 |
449 | sign-artifacts
450 | verify
451 |
452 | sign
453 |
454 |
455 |
456 |
457 |
458 | maven-site-plugin
459 |
460 |
461 | com.github.github
462 | site-maven-plugin
463 | 0.12
464 |
465 |
466 | site
467 |
468 | site
469 |
470 |
471 |
472 |
473 | Building site for ${project.version}
474 |
475 |
476 |
477 |
478 |
479 |
480 |
481 |
--------------------------------------------------------------------------------
/src/assembly/project.xml:
--------------------------------------------------------------------------------
1 |
2 | project
3 |
4 | tar.bz2
5 |
6 |
7 |
8 | .
9 |
10 |
11 | target/**
12 | .hg/**
13 | .classpath
14 | .project
15 | .settings/**
16 | null/**
17 | test-output/**
18 | tmp/**
19 | dist/**
20 | build/**
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/src/it/demo01/invoker.properties:
--------------------------------------------------------------------------------
1 | invoker.goals=clean package -e
2 | invoker.goals.2=package
3 |
--------------------------------------------------------------------------------
/src/it/demo01/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 | it.sandbox
7 | yuicompressor-maven-plugin-demo
8 | war
9 | 1.0-SNAPSHOT
10 | yuicompressor-maven-plugin-demo Maven Webapp
11 | http://maven.apache.org
12 |
13 |
14 | junit
15 | junit
16 | 3.8.2
17 | test
18 |
19 |
20 | org.apache.commons
21 | commons-io
22 | 1.3.2
23 | test
24 |
25 |
26 |
27 | rf01
28 | rf02
29 |
30 |
31 | yuicompressor-maven-plugin-demo
32 |
33 |
34 | src/main/resources
35 |
36 |
37 | src/main/resources-filtering
38 | true
39 |
40 |
41 | src/main/resources-redirect
42 | redirect
43 |
44 |
45 |
46 |
47 | @project.groupId@
48 | yuicompressor-maven-plugin
49 | @project.version@
50 |
51 |
52 |
53 | jslint
54 | compress
55 |
56 |
57 |
58 |
59 | true
60 | false
61 |
62 | true
63 | true
64 | true
65 |
66 | **/*.pack.js
67 | **/compressed.css
68 |
69 |
70 |
71 |
72 |
73 |
74 | true
75 |
76 |
77 |
78 | **/*.js
79 |
80 |
81 |
82 | **/*.pack.js
83 | **/compressed.css
84 |
85 |
86 |
87 |
88 | true
89 |
90 | true
91 |
92 |
93 |
94 | toAggregateAndRemove/foo.js
95 | toAggregateAndRemove/bar.js
96 |
97 |
98 |
99 |
100 |
101 |
102 | org.apache.maven.plugins
103 | maven-war-plugin
104 |
105 | **/toAggregateAndRemove/**
106 |
107 |
108 |
109 |
110 |
111 |
--------------------------------------------------------------------------------
/src/it/demo01/src/main/resources-filtering/file_rf01.js:
--------------------------------------------------------------------------------
1 | // compression must remove me
2 | var artifactId="${pom.artifactId}";
3 | var ${value.rf01}="rf01";
4 |
--------------------------------------------------------------------------------
/src/it/demo01/src/main/resources-filtering/file_rf02.js:
--------------------------------------------------------------------------------
1 | // compression must remove me
2 | var rf02=${value.rf02};
3 |
--------------------------------------------------------------------------------
/src/it/demo01/src/main/resources-redirect/file_rr01.js:
--------------------------------------------------------------------------------
1 | // compression must remove me
2 | var rr01="rr01";
3 |
--------------------------------------------------------------------------------
/src/it/demo01/src/main/resources-redirect/file_rr02.js:
--------------------------------------------------------------------------------
1 | // compression must remove me
2 | var rr02="rr02";
3 |
--------------------------------------------------------------------------------
/src/it/demo01/src/main/resources/file_r01.js:
--------------------------------------------------------------------------------
1 | // compression must remove me
2 | var r01="r01";
3 |
--------------------------------------------------------------------------------
/src/it/demo01/src/main/resources/file_r02.js:
--------------------------------------------------------------------------------
1 | // compression must remove me
2 | var r02="r02";
3 |
--------------------------------------------------------------------------------
/src/it/demo01/src/main/webapp/WEB-INF/web.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 | Archetype Created Web Application
7 |
8 |
--------------------------------------------------------------------------------
/src/it/demo01/src/main/webapp/index.jsp:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Hello World!
4 |
5 |
6 |
--------------------------------------------------------------------------------
/src/it/demo01/src/main/webapp/static/highlighter.js:
--------------------------------------------------------------------------------
1 | // Highlighter script By Ilija Studen - http://ilija.biz/
2 | // Modified from Woofoo forms
3 |
4 | /*--------------------------------------------------------------------------*/
5 |
6 | //http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/
7 | function getElementsByClassName(oElm, strTagName, strClassName){
8 | var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
9 | var arrReturnElements = new Array();
10 | strClassName = strClassName.replace(/\-/g, "\\-");
11 | var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
12 | var oElement;
13 | for(var i=0; i input{
95 | }
96 |
97 | .inlineLabels .selectInput{
98 | float:left;
99 | /* user prefs */
100 | width:69%;
101 | border:2px solid #dfdfdf;
102 | }
103 |
104 | .inlineLabels textarea{
105 | float:left;
106 | width:68%;
107 | /* user prefs */
108 | border:2px solid #dfdfdf;
109 | height:12em;
110 | }
111 |
112 | .inlineLabels .formHint{
113 | clear:both;
114 | /* user prefs */
115 | color:#999;
116 | margin:.5em 0 0 30%; padding:3px 0;
117 | font-size:80%;
118 | }
119 |
120 | /* inlineLabels esthetics */
121 | .inlineLabels .formHint strong{
122 | padding:0 0 0 14px;
123 | background:url(img/icon_alert.png) 0 0 no-repeat;
124 | display:inline-block;
125 | }
126 |
127 |
128 | /* ########################################################################## */
129 |
130 | /* Styles for form controls where labels are above the input elements */
131 | /* Set the class to the parent to .blockLabels */
132 | .blockLabels .ctrlHolder{
133 | }
134 |
135 | .blockLabels label,
136 | .blockLabels .label{
137 | display:block;
138 | float:none;
139 | margin:.3em 0; padding:0;
140 | line-height:100%;
141 | width:60%;
142 | /* user prefs */
143 | font-weight:bold;
144 | width:auto;
145 | }
146 | .blockLabels .label{
147 | float:left;
148 | margin-right:3em;
149 | }
150 |
151 | .blockLabels .textInput{
152 | float:left;
153 | width:60%;
154 | /* user prefs */
155 | border:2px solid #dfdfdf;
156 | }
157 |
158 | .blockLabels .selectInput{
159 | float:left;
160 | width:60%;
161 | /* user prefs */
162 | border:2px solid #dfdfdf;
163 |
164 | }
165 |
166 | .blockLabels textarea{
167 | display:block;
168 | float:left;
169 | width:60%;
170 | /* user prefs */
171 | border:2px solid #dfdfdf;
172 | height:12em;
173 | }
174 |
175 | .blockLabels .formHint{
176 | float:right;
177 | margin:0;
178 | width:38%;
179 | clear:none;
180 | /* user prefs */
181 | color:#999;
182 | font-size:80%;
183 | font-style:italic;
184 | }
185 |
186 | /* blockLabels esthetics */
187 | .blockLabels .ctrlHolder{
188 | border:1px solid #dfdfdf; border-width:1px 0;
189 | margin-top:-1px;
190 | }
191 |
192 | .blockLabels .focused{
193 | padding:7px 4px;
194 | }
195 |
196 | /* ########################################################################## */
197 |
198 | /* Focus pseudoclasses */
199 | .ctrlHolder .textInput:focus{
200 | border-color:#DFD77D;
201 | }
202 | div.focused .textInput:focus{
203 | }
204 | div.focused .formHint{
205 | color:#000;
206 | }
207 |
208 | /* Required asterisk styling, use if needed */
209 | label em,
210 | .label em{
211 | display:block;
212 | position:absolute; left:28%;
213 | font-style:normal;
214 | font-weight:bold;
215 | }
216 | .blockLabels label em,
217 | .blockLabels .label em{
218 | position:static;
219 | display:inline;
220 | }
221 |
222 | /* Messages */
223 | .uniForm #errorMsg{
224 | background:#ffdfdf url(img/uf_error.png);
225 | border:1px solid #df7d7d; border-width:1px 0;
226 | margin:0 0 1em 0; padding:1em;
227 | }
228 | .uniForm .error,
229 | .uniForm .blockLabels.ctrlHolder.error{
230 | background:#ffdfdf url(img/uf_error.png);
231 | border:1px solid #df7d7d; border-width:1px 0;
232 | position:relative;
233 | }
234 | .uniForm #errorMsg dt,
235 | .uniForm #errorMsg h3{
236 | margin:0 0 .5em 0;
237 | font-size:110%;
238 | line-height:100%;
239 | font-weight:bold;
240 | color:#000;
241 | padding:2px 0 2px 18px;
242 | background:url(img/icon-error.png) 0 0 no-repeat;
243 | }
244 | .uniForm #errorMsg dd{
245 | margin:0; padding:0;
246 | }
247 | .uniForm #errorMsg ol{
248 | margin:0; padding:0;
249 | }
250 | .uniForm #errorMsg ol li{
251 | margin:0; padding:2px;
252 | list-style-position:inside;
253 | border-bottom:1px dotted #df7d7d;
254 | position:relative;
255 | }
256 | .uniForm .errorField{
257 | margin:0 0 3px 0;
258 | }
259 | .uniForm .inlineLabels .errorField{
260 | margin-left:30%;
261 | }
262 | .uniForm .errorField strong{
263 | background:#FFE2E2;
264 | padding:1px 3px 3px 3px;
265 | }
266 | .ctrlHolder.error input,
267 | .ctrlHolder.error input:focus{
268 | border-color:#DF7D7D;
269 | }
270 | .ctrlHolder.error.focused{
271 | padding:7px 4px;
272 | }
273 |
--------------------------------------------------------------------------------
/src/it/demo01/src/main/webapp/static/uni-form.jquery.js:
--------------------------------------------------------------------------------
1 | jQuery.fn.uniform = function(settings) {
2 | settings = jQuery.extend({
3 | valid_class : 'valid',
4 | invalid_class : 'invalid',
5 | focused_class : 'focused',
6 | holder_class : 'ctrlHolder',
7 | field_selector : 'input, select, textarea'
8 | }, settings);
9 |
10 | return this.each(function() {
11 | var form = jQuery(this);
12 |
13 | // Focus specific control holder
14 | var focusControlHolder = function(element) {
15 | var parent = element.parent();
16 |
17 | while(typeof(parent) == 'object') {
18 | if(parent) {
19 | if(parent[0] && (parent[0].className.indexOf(settings.holder_class) >= 0)) {
20 | parent.addClass(settings.focused_class);
21 | return;
22 | } // if
23 | } // if
24 | parent = jQuery(parent.parent());
25 | } // while
26 | };
27 |
28 | // Select form fields and attach them higlighter functionality
29 | form.find(settings.field_selector).focus(function() {
30 | form.find('.' + settings.focused_class).removeClass(settings.focused_class);
31 | focusControlHolder(jQuery(this));
32 | }).blur(function() {
33 | form.find('.' + settings.focused_class).removeClass(settings.focused_class);
34 | });
35 | });
36 | };
37 |
38 | // Auto set on page load...
39 | $(document).ready(function() {
40 | jQuery('form.uniForm').uniform();
41 | });
--------------------------------------------------------------------------------
/src/it/demo01/src/main/webapp/static/zero.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/davidB/yuicompressor-maven-plugin/175bbbdde555f6e6eb4419f352818849da4f8665/src/it/demo01/src/main/webapp/static/zero.js
--------------------------------------------------------------------------------
/src/it/demo01/src/test/java/ResourcesTest.java:
--------------------------------------------------------------------------------
1 | package net_alchim31_maven_yuicompressor;
2 |
3 | import java.io.File;
4 |
5 | import junit.framework.TestCase;
6 |
7 | import org.apache.commons.io.FileUtils;
8 |
9 | public class ResourcesTest extends TestCase {
10 |
11 | private File outputDir_ = new File("target/classes");
12 |
13 | public void testSimpleResources() throws Exception {
14 | File r01 = new File(outputDir_, "file_r01.js");
15 | assertExists(r01);
16 | assertNoComments(r01);
17 |
18 | File r02 = new File(outputDir_, "file_r02.js");
19 | assertExists(r02);
20 | assertNoComments(r02);
21 | }
22 |
23 | public void testResourcesWithFilter() throws Exception {
24 | File r01 = new File(outputDir_, "file_rf01.js");
25 | assertExists(r01);
26 | assertNoComments(r01);
27 | assertNoFilteringValue(r01);
28 |
29 | File r02 = new File(outputDir_, "file_rf02.js");
30 | assertExists(r02);
31 | assertNoComments(r02);
32 | assertNoFilteringValue(r02);
33 | }
34 |
35 | public void testResourcesWithTargetPath() throws Exception {
36 | File r01 = new File(outputDir_, "redirect/file_rr01.js");
37 | assertExists(r01);
38 | assertNotExists(new File(outputDir_, "file_rr01.js"));
39 | assertNoComments(r01);
40 |
41 | File r02 = new File(outputDir_, "redirect/file_rr02.js");
42 | assertExists(r02);
43 | assertNotExists(new File(outputDir_, "file_rr02.js"));
44 | assertNoComments(r02);
45 | }
46 |
47 | private void assertExists(File file) throws Exception {
48 | assertTrue(file.getName() + " not found", file.exists());
49 | }
50 |
51 | private void assertNotExists(File file) throws Exception {
52 | assertFalse(file.getName() + " found", file.exists());
53 | }
54 |
55 | private void assertNoComments(File file) throws Exception {
56 | String content = FileUtils.readFileToString(file);
57 | //System.out.println(file + ": "+ content);
58 | assertTrue("comments found (=> not compressed)", content.indexOf("//") < 0);
59 | assertTrue("comments found (=> not compressed)", content.indexOf("/*") < 0);
60 | }
61 |
62 | private void assertNoFilteringValue(File file) throws Exception {
63 | String content = FileUtils.readFileToString(file);
64 | assertTrue("property to filter found", content.indexOf("${") < 0);
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/src/it/demo01/validate.groovy:
--------------------------------------------------------------------------------
1 | try {
2 |
3 | //TODO
4 |
5 | return true
6 |
7 | } catch(Throwable e) {
8 | e.printStackTrace()
9 | return false
10 | }
--------------------------------------------------------------------------------
/src/it/issue19/invoker.properties:
--------------------------------------------------------------------------------
1 | invoker.goals=process-resources
--------------------------------------------------------------------------------
/src/it/issue19/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 | it.sandbox
7 | issu19
8 | 1.0-SNAPSHOT
9 |
10 | rf01
11 | rf02
12 |
13 |
14 |
15 | src/main/filters/dev.properties
16 |
17 |
18 |
19 | src/main/resources
20 | true
21 |
22 | webapp.properties
23 |
24 |
25 |
26 |
27 |
28 | @project.groupId@
29 | yuicompressor-maven-plugin
30 | @project.version@
31 |
32 | true
33 | false
34 |
35 |
36 |
37 | compress-js-css
38 | process-resources
39 |
40 | compress
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/src/it/issue19/src/main/filters/dev.properties:
--------------------------------------------------------------------------------
1 | prop.fake=fake
--------------------------------------------------------------------------------
/src/it/issue19/src/main/resources/file_r01.js:
--------------------------------------------------------------------------------
1 | // compression must remove me
2 | var r01="r01";
3 |
--------------------------------------------------------------------------------
/src/it/issue19/src/main/resources/file_r02.js:
--------------------------------------------------------------------------------
1 | // compression must remove me
2 | var r02="r02";
3 |
--------------------------------------------------------------------------------
/src/it/issue19/src/main/resources/webapp.properties:
--------------------------------------------------------------------------------
1 | # a property file that should not be compressed,...
2 | # see https://github.com/davidB/yuicompressor-maven-plugin/issues/19
3 |
4 | prop.fake=${prop.fake}
5 | prop.rf01=${value.rf01}
--------------------------------------------------------------------------------
/src/it/issue19/validate.groovy:
--------------------------------------------------------------------------------
1 | try {
2 |
3 | targetLg = new File(basedir, "target/classes/webapp.properties").size()
4 | assert targetLg > 0 : "webapp.properties empty (check that compression didn't run over it (=> remove content))"
5 |
6 | return true
7 |
8 | } catch(Throwable e) {
9 | e.printStackTrace()
10 | return false
11 | }
--------------------------------------------------------------------------------
/src/main/java/net_alchim31_maven_yuicompressor/Aggregation.java:
--------------------------------------------------------------------------------
1 | package net_alchim31_maven_yuicompressor;
2 |
3 | import org.codehaus.plexus.util.DirectoryScanner;
4 | import org.codehaus.plexus.util.IOUtil;
5 | import org.sonatype.plexus.build.incremental.BuildContext;
6 |
7 | import java.io.File;
8 | import java.io.FileInputStream;
9 | import java.io.OutputStream;
10 | import java.util.*;
11 |
12 | public class Aggregation {
13 | public File inputDir;
14 | public File output;
15 | public String[] includes;
16 | public String[] excludes;
17 | public boolean removeIncluded = false;
18 | public boolean insertNewLine = false;
19 | public boolean insertFileHeader = false;
20 | public boolean fixLastSemicolon = false;
21 | public boolean autoExcludeWildcards = false;
22 |
23 | public List run(Collection previouslyIncludedFiles, BuildContext buildContext) throws Exception {
24 | return this.run(previouslyIncludedFiles, buildContext, null);
25 | }
26 |
27 | public List run(Collection previouslyIncludedFiles, BuildContext buildContext, Set incrementalFiles) throws Exception {
28 | defineInputDir();
29 |
30 | List files;
31 | if (autoExcludeWildcards) {
32 | files = getIncludedFiles(previouslyIncludedFiles, buildContext, incrementalFiles);
33 | } else {
34 | files = getIncludedFiles(null, buildContext, incrementalFiles);
35 | }
36 |
37 | if (files.size() != 0) {
38 | output = output.getCanonicalFile();
39 | output.getParentFile().mkdirs();
40 | OutputStream out = buildContext.newFileOutputStream(output);
41 | try {
42 | for (File file : files) {
43 | if (file.getCanonicalPath().equals(output.getCanonicalPath())) {
44 | continue;
45 | }
46 | FileInputStream in = new FileInputStream(file);
47 | try {
48 | if (insertFileHeader) {
49 | out.write(createFileHeader(file).getBytes());
50 | }
51 | IOUtil.copy(in, out);
52 | if (fixLastSemicolon) {
53 | out.write(';');
54 | }
55 | if (insertNewLine) {
56 | out.write('\n');
57 | }
58 | } finally {
59 | IOUtil.close(in);
60 | in = null;
61 | }
62 | if (removeIncluded) {
63 | file.delete();
64 | buildContext.refresh(file);
65 | }
66 | }
67 | } finally {
68 | IOUtil.close(out);
69 | out = null;
70 | }
71 | }
72 | return files;
73 | }
74 |
75 | private String createFileHeader(File file) {
76 | StringBuilder header = new StringBuilder();
77 | header.append("/*");
78 | header.append(file.getName());
79 | header.append("*/");
80 |
81 | if (insertNewLine) {
82 | header.append('\n');
83 | }
84 |
85 | return header.toString();
86 | }
87 |
88 | private void defineInputDir() throws Exception {
89 | if (inputDir == null) {
90 | inputDir = output.getParentFile();
91 | }
92 | inputDir = inputDir.getCanonicalFile();
93 | if (!inputDir.isDirectory()) {
94 | throw new IllegalStateException("input directory not found: " + inputDir);
95 | }
96 | }
97 |
98 | private List getIncludedFiles(Collection previouslyIncludedFiles, BuildContext buildContext, Set incrementalFiles) throws Exception {
99 | List filesToAggregate = new ArrayList<>();
100 | if (includes != null) {
101 | for (String include : includes) {
102 | addInto(include, filesToAggregate, previouslyIncludedFiles);
103 | }
104 | }
105 |
106 | //If build is incremental with no delta, then don't include for aggregation
107 | if (buildContext.isIncremental()) {
108 |
109 | if (incrementalFiles != null) {
110 | boolean aggregateMustBeUpdated = false;
111 | for (File file : filesToAggregate) {
112 | if (incrementalFiles.contains(file.getAbsolutePath())) {
113 | aggregateMustBeUpdated = true;
114 | break;
115 | }
116 | }
117 |
118 | if (aggregateMustBeUpdated) {
119 | return filesToAggregate;
120 | }
121 | }
122 | return new ArrayList();
123 | } else {
124 | return filesToAggregate;
125 | }
126 |
127 | }
128 |
129 | private void addInto(String include, List includedFiles, Collection previouslyIncludedFiles) throws Exception {
130 | if (include.indexOf('*') > -1) {
131 | DirectoryScanner scanner = newScanner();
132 | scanner.setIncludes(new String[]{include});
133 | scanner.scan();
134 | String[] rpaths = scanner.getIncludedFiles();
135 | Arrays.sort(rpaths);
136 | for (String rpath : rpaths) {
137 | File file = new File(scanner.getBasedir(), rpath);
138 | if (!includedFiles.contains(file) && (previouslyIncludedFiles == null || !previouslyIncludedFiles.contains(file))) {
139 | includedFiles.add(file);
140 | }
141 | }
142 | } else {
143 | File file = new File(include);
144 | if (!file.isAbsolute()) {
145 | file = new File(inputDir, include);
146 | }
147 | if (!includedFiles.contains(file)) {
148 | includedFiles.add(file);
149 | }
150 | }
151 | }
152 |
153 | private DirectoryScanner newScanner() throws Exception {
154 | DirectoryScanner scanner = new DirectoryScanner();
155 | scanner.setBasedir(inputDir);
156 | if ((excludes != null) && (excludes.length != 0)) {
157 | scanner.setExcludes(excludes);
158 | }
159 | scanner.addDefaultExcludes();
160 | return scanner;
161 | }
162 | }
163 |
--------------------------------------------------------------------------------
/src/main/java/net_alchim31_maven_yuicompressor/BasicRhinoShell.java:
--------------------------------------------------------------------------------
1 | /* ***** BEGIN LICENSE BLOCK *****
2 | * Version: MPL 1.1/GPL 2.0
3 | *
4 | * The contents of this file are subject to the Mozilla Public License Version
5 | * 1.1 (the "License"); you may not use this file except in compliance with
6 | * the License. You may obtain a copy of the License at
7 | * http://www.mozilla.org/MPL/
8 | *
9 | * Software distributed under the License is distributed on an "AS IS" basis,
10 | * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 | * for the specific language governing rights and limitations under the
12 | * License.
13 | *
14 | * The Original Code is Rhino code, released
15 | * May 6, 1998.
16 | *
17 | * The Initial Developer of the Original Code is
18 | * Netscape Communications Corporation.
19 | * Portions created by the Initial Developer are Copyright (C) 1997-1999
20 | * the Initial Developer. All Rights Reserved.
21 | *
22 | * Contributor(s):
23 | *
24 | * Alternatively, the contents of this file may be used under the terms of
25 | * the GNU General Public License Version 2 or later (the "GPL"), in which
26 | * case the provisions of the GPL are applicable instead of those above. If
27 | * you wish to allow use of your version of this file only under the terms of
28 | * the GPL and not to allow others to use your version of this file under the
29 | * MPL, indicate your decision by deleting the provisions above and replacing
30 | * them with the notice and other provisions required by the GPL. If you do
31 | * not delete the provisions above, a recipient may use your version of this
32 | * file under either the MPL or the GPL.
33 | *
34 | * ***** END LICENSE BLOCK ***** */
35 |
36 | package net_alchim31_maven_yuicompressor;
37 |
38 | import org.codehaus.plexus.util.IOUtil;
39 | import org.mozilla.javascript.*;
40 |
41 | import java.io.*;
42 |
43 | /**
44 | * The BasicRhinoShell program.
45 | *
46 | * Can execute scripts interactively or in batch mode at the command line. An
47 | * example of controlling the JavaScript engine.
48 | *
49 | * @author Norris Boyd
50 | * @based http://lxr.mozilla.org/mozilla/source/js/rhino/examples/BasicRhinoShell.java
51 | * (2007-08-30)
52 | */
53 | @SuppressWarnings("serial")
54 | public class BasicRhinoShell extends ScriptableObject {
55 |
56 | @Override
57 | public String getClassName() {
58 | return "global";
59 | }
60 |
61 | /**
62 | * Main entry point.
63 | *
64 | * Process arguments as would a normal Java program. Also create a new
65 | * Context and associate it with the current thread. Then set up the
66 | * execution environment and begin to execute scripts.
67 | */
68 | public static void exec(String[] args, ErrorReporter reporter) {
69 | // Associate a new Context with this thread
70 | Context cx = Context.enter();
71 | cx.setErrorReporter(reporter);
72 | try {
73 | // Initialize the standard objects (Object, Function, etc.)
74 | // This must be done before scripts can be executed.
75 | BasicRhinoShell BasicRhinoShell = new BasicRhinoShell();
76 | cx.initStandardObjects(BasicRhinoShell);
77 |
78 | // Define some global functions particular to the BasicRhinoShell.
79 | // Note
80 | // that these functions are not part of ECMA.
81 | String[] names = {"print", "quit", "version", "load", "help", "readFile", "warn"};
82 | BasicRhinoShell.defineFunctionProperties(names, BasicRhinoShell.class, ScriptableObject.DONTENUM);
83 |
84 | args = processOptions(cx, args);
85 |
86 | // Set up "arguments" in the global scope to contain the command
87 | // line arguments after the name of the script to execute
88 | Object[] array;
89 | if (args.length == 0) {
90 | array = new Object[0];
91 | } else {
92 | int length = args.length - 1;
93 | array = new Object[length];
94 | System.arraycopy(args, 1, array, 0, length);
95 | }
96 | Scriptable argsObj = cx.newArray(BasicRhinoShell, array);
97 | BasicRhinoShell.defineProperty("arguments", argsObj, ScriptableObject.DONTENUM);
98 |
99 | BasicRhinoShell.processSource(cx, args.length == 0 ? null : args[0]);
100 | } finally {
101 | Context.exit();
102 | }
103 | }
104 |
105 | /**
106 | * Parse arguments.
107 | */
108 | public static String[] processOptions(Context cx, String[] args) {
109 | for (int i = 0; i < args.length; i++) {
110 | String arg = args[i];
111 | if (!arg.startsWith("-")) {
112 | String[] result = new String[args.length - i];
113 | for (int j = i; j < args.length; j++) {
114 | result[j - i] = args[j];
115 | }
116 | return result;
117 | }
118 | if (arg.equals("-version")) {
119 | if (++i == args.length) {
120 | usage(arg);
121 | }
122 | double d = Context.toNumber(args[i]);
123 | if (d != d) {
124 | usage(arg);
125 | }
126 | cx.setLanguageVersion((int) d);
127 | continue;
128 | }
129 | usage(arg);
130 | }
131 | return new String[0];
132 | }
133 |
134 | /**
135 | * Print a usage message.
136 | */
137 | private static void usage(String s) {
138 | p("Didn't understand \"" + s + "\".");
139 | p("Valid arguments are:");
140 | p("-version 100|110|120|130|140|150|160|170");
141 | System.exit(1);
142 | }
143 |
144 | /**
145 | * Print a help message.
146 | *
147 | * This method is defined as a JavaScript function.
148 | */
149 | public void help() {
150 | p("");
151 | p("Command Description");
152 | p("======= ===========");
153 | p("help() Display usage and help messages. ");
154 | p("defineClass(className) Define an extension using the Java class");
155 | p(" named with the string argument. ");
156 | p(" Uses ScriptableObject.defineClass(). ");
157 | p("load(['foo.js', ...]) Load JavaScript source files named by ");
158 | p(" string arguments. ");
159 | p("loadClass(className) Load a class named by a string argument.");
160 | p(" The class must be a script compiled to a");
161 | p(" class file. ");
162 | p("print([expr ...]) Evaluate and print expressions. ");
163 | p("quit() Quit the BasicRhinoShell. ");
164 | p("version([number]) Get or set the JavaScript version number.");
165 | p("");
166 | }
167 |
168 | /**
169 | * Print the string values of its arguments.
170 | *
171 | * This method is defined as a JavaScript function. Note that its arguments
172 | * are of the "varargs" form, which allows it to handle an arbitrary number
173 | * of arguments supplied to the JavaScript function.
174 | */
175 | public static void print(Context cx, Scriptable thisObj, Object[] args, Function funObj) {
176 | for (int i = 0; i < args.length; i++) {
177 | if (i > 0) {
178 | System.out.print(" ");
179 | }
180 |
181 | // Convert the arbitrary JavaScript value into a string form.
182 | String s = Context.toString(args[i]);
183 |
184 | System.out.print(s);
185 | }
186 | System.out.println();
187 | }
188 |
189 | /**
190 | * Quit the BasicRhinoShell.
191 | *
192 | * This only affects the interactive mode.
193 | *
194 | * This method is defined as a JavaScript function.
195 | */
196 | public void quit() {
197 | quitting = true;
198 | }
199 |
200 | public static void warn(Context cx, Scriptable thisObj, Object[] args, Function funObj) {
201 | String message = Context.toString(args[0]);
202 | int line = (int) Context.toNumber(args[1]);
203 | String source = Context.toString(args[2]);
204 | int column = (int) Context.toNumber(args[3]);
205 | cx.getErrorReporter().warning(message, null, line, source, column);
206 | }
207 |
208 | /**
209 | * This method is defined as a JavaScript function.
210 | */
211 | public String readFile(String path) {
212 | try {
213 | return IOUtil.toString(new FileInputStream(path));
214 | } catch (RuntimeException exc) {
215 | throw exc;
216 | } catch (Exception exc) {
217 | throw new RuntimeException("wrap: " + exc.getMessage(), exc);
218 | }
219 | }
220 |
221 | /**
222 | * Get and set the language version.
223 | *
224 | * This method is defined as a JavaScript function.
225 | */
226 | public static double version(Context cx, Scriptable thisObj, Object[] args, Function funObj) {
227 | double result = cx.getLanguageVersion();
228 | if (args.length > 0) {
229 | double d = Context.toNumber(args[0]);
230 | cx.setLanguageVersion((int) d);
231 | }
232 | return result;
233 | }
234 |
235 | /**
236 | * Load and execute a set of JavaScript source files.
237 | *
on web, is to download/call one big js file instead of several small files.
10 |
in source code organisation is to have unit file (with one "concern").
11 |
12 |
13 |
The major js and css framework/lib provide source code in both version (one big, lot of small), or provide a online tool to generate the big.
14 |
The following option allow you to use/store small files into your source and generate the big at build time. The aggregation is done after yuicompression
Using removeIncluded option, remove file, but the war plugin will then add file.
71 | So if you want to remove file after aggregation and don't want war plugin copy them, then you need to use warSourceExcludes :
72 |
74 | ...
75 |
76 |
77 | ...
78 |
79 | net.alchim31.maven
80 | yuicompressor-maven-plugin
81 |
82 |
83 |
84 | compress
85 |
86 |
87 |
88 |
89 | true
90 |
91 |
92 |
93 | true
94 |
95 | true
96 |
97 |
98 |
99 | toAggregateAndRemove/**.js
100 |
101 |
102 |
103 |
104 |
105 | ...
106 |
107 | org.apache.maven.plugins
108 | maven-war-plugin
109 |
110 | **/toAggregateAndRemove/**
111 |
112 |
113 | ...
114 |
115 |
116 | ...
117 |
118 | ]]>
119 |
120 |
121 |
122 |
When aggregating minified js files, the copyright headers have been stripped out which is fine because we don't want to repeat it several times in the output file.
123 | However it would be great to be able to insert one at beginning of output file.
124 |
125 |
For simple cases, the maven-license-plugin is enough if you use the same header for all files but it is not enough if you want to have a different header per aggregation (different libraries with different licensing schemes).
126 |
127 |
you put license header in its own file (ex license_js.txt)
Compress (Minify + Ofuscate) Javascript files and CSS files
42 | using YUI Compressor from Julien Lecomte.
43 | Because Javascript compression could need time and resource, and to avoid repetitive (stupid) resources consumming at runtime, this plugin do compression of static files at compile time .
44 |
45 |
Compression is applied on webapp dir (src/main/webapp) and on resources (usefull for framework like Wicket where js and css could be in jar).
46 |
Compressed Files are renamed with a suffix (default "-min"), so both version are available (compressed and original) in the targeting application, but if you don't want to keep original and want to overwrite it set option 'nosuffix' to 'true'.
Winstone Maven Plugin: Embed your warfile into/with the winstone JAR itself. This allows an all-in-one container plus web-application JAR file to run as a standalone application.
To Compress every js and css files :
10 | mvn net.alchim31.maven:yuicompressor-maven-plugin:compress
12 | ]]>
13 | with the -X option compressed file are listed.
14 |
15 |
16 |
To force compress every js and css files and fail if warning :
17 | mvn net.alchim31.maven:yuicompressor-maven-plugin:compress \
19 | -Dmaven.yuicompressor.force=true \
20 | -Dmaven.yuicompressor.failOnWarning=true \
21 | ]]>
22 |