1 package org.apache.maven.plugin.war.packaging;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.maven.artifact.Artifact;
23 import org.apache.maven.model.Dependency;
24 import org.apache.maven.plugin.MojoExecutionException;
25 import org.apache.maven.plugin.MojoFailureException;
26 import org.apache.maven.plugin.war.util.WebappStructure;
27
28 import java.io.File;
29
30
31
32
33
34
35
36
37
38 public class DependenciesAnalysisPackagingTask
39 extends AbstractWarPackagingTask
40 {
41
42 public void performPackaging( final WarPackagingContext context )
43 throws MojoExecutionException, MojoFailureException
44 {
45
46 context.getWebappStructure().analyseDependencies( new DependenciesAnalysisCallbackImpl( context ) );
47
48 }
49
50 protected void handleDependency( WarPackagingContext context, Dependency dependency, String notBundledMessage,
51 String warOrZipMessage, String standardMessage, boolean removeFile )
52 {
53 if ( Artifact.SCOPE_PROVIDED.equals( dependency.getScope() )
54 || Artifact.SCOPE_TEST.equals( dependency.getScope() ) || dependency.isOptional() )
55 {
56 context.getLog().debug( notBundledMessage );
57 }
58 else if ( "war".equals( dependency.getType() ) || "zip".equals( dependency.getType() ) )
59 {
60 context.getLog().warn( warOrZipMessage );
61 }
62 else if ( "tld".equals( dependency.getType() ) || "aar".equals( dependency.getType() )
63 || "jar".equals( dependency.getType() ) || "ejb".equals( dependency.getType() )
64 || "ejb-client".equals( dependency.getType() ) || "test-jar".equals( dependency.getType() )
65 || "par".equals( dependency.getType() ) )
66 {
67 context.getLog().info( standardMessage );
68 if ( removeFile )
69 {
70 removeDependency( context, dependency );
71 }
72 }
73 }
74
75 protected void handleDependencyScope( WarPackagingContext context, Dependency dependency, String warOrZipMessage,
76 String standardMessage, boolean removeFile )
77 {
78 if ( "war".equals( dependency.getType() ) || "zip".equals( dependency.getType() ) )
79 {
80 context.getLog().warn( warOrZipMessage );
81 }
82 else if ( "tld".equals( dependency.getType() ) || "aar".equals( dependency.getType() )
83 || "jar".equals( dependency.getType() ) || "ejb".equals( dependency.getType() )
84 || "ejb-client".equals( dependency.getType() ) || "test-jar".equals( dependency.getType() )
85 || "par".equals( dependency.getType() ) )
86 {
87 context.getLog().info( standardMessage );
88 if ( removeFile )
89 {
90 removeDependency( context, dependency );
91 }
92 }
93 }
94
95 private void removeDependency( WarPackagingContext context, Dependency dependency )
96 {
97 final String targetFileName = context.getWebappStructure().getCachedTargetFileName( dependency );
98 if ( targetFileName != null )
99 {
100 final String type = dependency.getType();
101 File targetFile = null;
102 if ( "tld".equals( type ) )
103 {
104 targetFile = new File( context.getWebappDirectory(), ArtifactsPackagingTask.TLD_PATH + targetFileName );
105 }
106 else if ( "aar".equals( type ) )
107 {
108 targetFile =
109 new File( context.getWebappDirectory(), ArtifactsPackagingTask.SERVICES_PATH + targetFileName );
110 }
111 else if ( "jar".equals( type ) || "ejb".equals( type ) || "ejb-client".equals( type )
112 || "test-jar".equals( type ) )
113 {
114 targetFile = new File( context.getWebappDirectory(), LIB_PATH + targetFileName );
115 }
116 else if ( "par".equals( type ) )
117 {
118 String targetFileName2 = targetFileName.substring( 0, targetFileName.lastIndexOf( '.' ) ) + ".jar";
119 targetFile = new File( context.getWebappDirectory(), LIB_PATH + targetFileName2 );
120 }
121
122
123 if ( targetFile == null )
124 {
125 context.getLog().error( "Could not get file from dependency [" + dependency + "]" );
126 }
127 else if ( targetFile.exists() )
128 {
129 context.getLog().debug( "Removing file [" + targetFile.getAbsolutePath() + "]" );
130 targetFile.delete();
131 }
132 else
133 {
134 context.getLog().warn( "File to remove [" + targetFile.getAbsolutePath() + "] has not been found" );
135 }
136 }
137 else
138 {
139 context.getLog().warn( "Could not retrieve the target file name of dependency [" + dependency + "]" );
140 }
141 }
142
143
144 class DependenciesAnalysisCallbackImpl
145 implements WebappStructure.DependenciesAnalysisCallback
146 {
147 private final WarPackagingContext context;
148
149 DependenciesAnalysisCallbackImpl( WarPackagingContext context )
150 {
151 this.context = context;
152 }
153
154 public void unchangedDependency( Dependency dependency )
155 {
156 context.getLog().debug( "Dependency [" + dependency + "] has not changed since last build." );
157 }
158
159 public void newDependency( Dependency dependency )
160 {
161 context.getLog().debug( "New dependency [" + dependency + "]." );
162 }
163
164 public void removedDependency( Dependency dependency )
165 {
166 handleDependency( context, dependency, "Dependency [" + dependency
167 + "] has been removed from the project but it was not bundled anyway.", "Dependency [" + dependency
168 + "] has been removed from the project. If it was included in the build as an overlay, "
169 + "consider cleaning the target directory of the project (mvn clean)", "Dependency [" + dependency
170 + "] has been removed from the project.", true );
171 }
172
173 public void updatedVersion( Dependency dependency, String previousVersion )
174 {
175 handleDependency( context, dependency, "Version of dependency [" + dependency + "] has changed ("
176 + previousVersion + " -> " + dependency.getVersion() + ") but it was not bundled anyway.",
177 "Version of dependency [" + dependency + "] has changed ("
178 + previousVersion + " -> " + dependency.getVersion()
179 + "). If it was included in the build as an overlay, "
180 + "consider "
181 + "cleaning the target directory of the project (mvn clean)",
182 "Version of dependency [" + dependency + "] has changed ("
183 + previousVersion + " -> " + dependency.getVersion() + ").",
184 true );
185 }
186
187 public void updatedScope( Dependency dependency, String previousScope )
188 {
189 if ( Artifact.SCOPE_PROVIDED.equals( dependency.getScope() ) || Artifact.SCOPE_TEST.equals(
190 dependency.getScope() )
191 && ( !Artifact.SCOPE_PROVIDED.equals( previousScope )
192 && !Artifact.SCOPE_TEST.equals( previousScope ) ) )
193 {
194
195 handleDependencyScope( context, dependency, "Scope of dependency [" + dependency + "] has changed ("
196 + previousScope + " -> " + dependency.getScope()
197 + "). If it was included in the build as an overlay, "
198 + "consider cleaning the target directory of the project (mvn clean)", "Scope of dependency ["
199 + dependency + "] has changed (" + previousScope + " -> " + dependency.getScope() + ").", true );
200 }
201
202 }
203
204
205 public void updatedOptionalFlag( Dependency dependency, boolean previousOptional )
206 {
207 if ( !previousOptional && dependency.isOptional() )
208 {
209
210 handleDependency( context, dependency,
211 "Dependency [" + dependency + "] is now optional but it was not bundled anyway.",
212 "Dependency [" + dependency
213 + "] is now optional. If it was included in the build as an overlay, "
214 + "consider cleaning the target directory of the project (mvn clean)",
215 "Dependency [" + dependency + "] is now optional", true );
216
217
218 }
219 }
220
221 public void updatedUnknown( Dependency dependency, Dependency previousDep )
222 {
223 handleDependency( context, dependency, "Dependency [" + dependency + "] has changed (was " + previousDep
224 + ") but it was not bundled anyway.", "Dependency [" + dependency + "] has changed (was " + previousDep
225 + "). If it was included in the build as an overlay, " + "consider "
226 + "cleaning the target directory of the project (mvn clean)", "Dependency [" + dependency
227 + "] has changed (was " + previousDep + ").", true );
228 }
229
230 }
231
232 }