1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  package org.apache.maven.plugins.ear.util;
20  
21  import java.util.List;
22  import java.util.Set;
23  
24  import org.apache.maven.archiver.MavenArchiveConfiguration;
25  import org.apache.maven.archiver.MavenArchiver;
26  import org.apache.maven.artifact.DependencyResolutionRequiredException;
27  import org.apache.maven.execution.MavenSession;
28  import org.apache.maven.plugins.ear.EarModule;
29  import org.apache.maven.project.MavenProject;
30  import org.codehaus.plexus.archiver.jar.Manifest;
31  import org.codehaus.plexus.archiver.jar.ManifestException;
32  
33  
34  
35  
36  
37  
38  
39  public class EarMavenArchiver extends MavenArchiver {
40      
41  
42  
43      public static final String CLASS_PATH_KEY = "Class-Path";
44  
45      private final List<EarModule> earModules;
46  
47      
48  
49  
50  
51  
52      public EarMavenArchiver(List<EarModule> earModules) {
53          this.earModules = earModules;
54      }
55  
56      
57  
58  
59  
60  
61  
62  
63  
64      public Manifest getManifest(MavenProject project, MavenArchiveConfiguration config)
65              throws ManifestException, DependencyResolutionRequiredException {
66          return this.getManifest(null, project, config);
67      }
68  
69      
70      public Manifest getManifest(MavenSession session, MavenProject project, MavenArchiveConfiguration config)
71              throws ManifestException, DependencyResolutionRequiredException {
72          final Manifest manifest = super.getManifest(session, project, config);
73          if (config.getManifest().isAddClasspath()) {
74              String earManifestClassPathEntry =
75                      generateClassPathEntry(config.getManifest().getClasspathPrefix());
76              
77              
78              final String userSuppliedClassPathEntry = getUserSuppliedClassPathEntry(config);
79              if (userSuppliedClassPathEntry != null) {
80                  earManifestClassPathEntry = userSuppliedClassPathEntry + " " + earManifestClassPathEntry;
81              }
82  
83              
84              final Manifest.Attribute classPathAttr = manifest.getMainSection().getAttribute(CLASS_PATH_KEY);
85              if (classPathAttr != null) {
86                  classPathAttr.setValue(earManifestClassPathEntry);
87              } else {
88                  final Manifest.Attribute attr = new Manifest.Attribute(CLASS_PATH_KEY, earManifestClassPathEntry);
89                  manifest.addConfiguredAttribute(attr);
90              }
91          }
92          return manifest;
93      }
94  
95      
96  
97  
98  
99  
100 
101     protected String generateClassPathEntry(String classPathPrefix) {
102         final StringBuilder classpath = new StringBuilder();
103         for (final EarModule earModule : earModules) {
104             if (!earModule.isExcluded()) {
105                 classpath.append(classPathPrefix).append(earModule.getUri()).append(" ");
106             }
107         }
108         return classpath.toString().trim();
109     }
110 
111     
112 
113 
114 
115     protected String getUserSuppliedClassPathEntry(MavenArchiveConfiguration config) {
116         if (config.getManifestEntries() != null) {
117             final Set<String> keys = config.getManifestEntries().keySet();
118             for (String key : keys) {
119                 String value = config.getManifestEntries().get(key);
120                 if ("Class-Path".equals(key) && value != null) {
121                     return value;
122                 }
123             }
124         }
125         return null;
126     }
127 }