diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/ejb/EjbJar.java b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/EjbJar.java index 8c866fa57..fe7b5b663 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/ejb/EjbJar.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/EjbJar.java @@ -199,6 +199,11 @@ public class EjbJar extends MatchingTask { * The Manifest file */ public File manifest; + + /** + * The dependency analyzer to use to add additional classes to the jar + */ + public String analyzer; } /** @@ -442,6 +447,15 @@ public class EjbJar extends MatchingTask { config.descriptorDir = inDir; } + /** + * Set the analyzer to use when adding in dependencies to the jar + * + * @param analyzer the name of the dependency analyzer or a class. + */ + public void setDependency(String analyzer) { + config.analyzer = analyzer; + } + /** * Set the base name of the EJB jar that is to be created if it is not * to be determined from the name of the deployment descriptor files. diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/ejb/GenericDeploymentTool.java b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/GenericDeploymentTool.java index 4f6c57d36..cc893bd55 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/ejb/GenericDeploymentTool.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/ejb/GenericDeploymentTool.java @@ -103,7 +103,21 @@ public class GenericDeploymentTool implements EJBDeploymentTool { /** Name for EJB Deployment descriptor within EJB jars */ protected static final String EJB_DD = "ejb-jar.xml"; - public static final String DEFAULT_ANALYZER_CLASS + /** A dependency analyzer name to find ancestor classes */ + public static final String ANALYZER_SUPER = "super"; + /** A dependency analyzer name to find all related classes */ + public static final String ANALYZER_FULL = "full"; + /** A dependency analyzer name for no analyzer */ + public static final String ANALYZER_NONE = "none"; + + /** The default analyzer */ + public static final String DEFAULT_ANALYZER = ANALYZER_SUPER; + + /** The analyzer class for the super analyzer */ + public static final String ANALYZER_CLASS_SUPER + = "org.apache.tools.ant.util.depend.bcel.AncestorAnalyzer"; + /** The analyzer class for the super analyzer */ + public static final String ANALYZER_CLASS_FULL = "org.apache.tools.ant.util.depend.bcel.FullAnalyzer"; /** @@ -151,14 +165,6 @@ public class GenericDeploymentTool implements EJBDeploymentTool { private DependencyAnalyzer dependencyAnalyzer; public GenericDeploymentTool() { - String analyzerClassName = DEFAULT_ANALYZER_CLASS; - try { - Class analyzerClass = Class.forName(analyzerClassName); - dependencyAnalyzer = (DependencyAnalyzer)analyzerClass.newInstance(); - } catch (Exception e) { - task.log("Unable to load dependency analyzer: " + analyzerClassName, - Project.MSG_VERBOSE); - } } @@ -172,7 +178,7 @@ public class GenericDeploymentTool implements EJBDeploymentTool { } /** - * Get the desitination directory. + * Get the destination directory. * * @return the destination directory into which EJB jars are to be written */ @@ -285,7 +291,43 @@ public class GenericDeploymentTool implements EJBDeploymentTool { return getTask().getLocation(); } - + private void createAnalyzer() { + String analyzer = config.analyzer; + if (analyzer == null) { + analyzer = DEFAULT_ANALYZER; + } + + if (analyzer.equals(ANALYZER_NONE)) { + return; + } + + String analyzerClassName = null; + if (analyzer.equals(ANALYZER_SUPER)) { + analyzerClassName = ANALYZER_CLASS_SUPER; + } else if (analyzer.equals(ANALYZER_FULL)) { + analyzerClassName = ANALYZER_CLASS_FULL; + } else { + analyzerClassName = analyzer; + } + + try { + Class analyzerClass = Class.forName(analyzerClassName); + dependencyAnalyzer = (DependencyAnalyzer)analyzerClass.newInstance(); + dependencyAnalyzer.addClassPath(new Path(task.getProject(), + config.srcDir.getPath())); + dependencyAnalyzer.addClassPath(config.classpath); + } catch (NoClassDefFoundError e) { + dependencyAnalyzer = null; + task.log("Unable to load dependency analyzer: " + analyzerClassName, + Project.MSG_WARN); + } catch (Exception e) { + dependencyAnalyzer = null; + task.log("Unable to load dependency analyzer: " + analyzerClassName, + Project.MSG_WARN); + } + } + + /** * Configure this tool for use in the ejbjar task. * @@ -293,10 +335,8 @@ public class GenericDeploymentTool implements EJBDeploymentTool { */ public void configure(EjbJar.Config config) { this.config = config; - dependencyAnalyzer.addClassPath(new Path(task.getProject(), - config.srcDir.getPath())); - dependencyAnalyzer.addClassPath(config.classpath); + createAnalyzer(); classpathLoader = null; } @@ -814,6 +854,10 @@ public class GenericDeploymentTool implements EJBDeploymentTool { protected void checkAndAddDependants(Hashtable checkEntries) throws BuildException { + if (dependencyAnalyzer == null) { + return; + } + dependencyAnalyzer.reset(); Iterator i = checkEntries.keySet().iterator(); diff --git a/src/main/org/apache/tools/ant/util/depend/bcel/AncestorAnalyzer.java b/src/main/org/apache/tools/ant/util/depend/bcel/AncestorAnalyzer.java index 181456b73..44792073f 100644 --- a/src/main/org/apache/tools/ant/util/depend/bcel/AncestorAnalyzer.java +++ b/src/main/org/apache/tools/ant/util/depend/bcel/AncestorAnalyzer.java @@ -68,6 +68,16 @@ import org.apache.tools.ant.util.depend.AbstractAnalyzer; * @author Conor MacNeill */ public class AncestorAnalyzer extends AbstractAnalyzer { + + public AncestorAnalyzer() { + // force BCEL classes to load now + try { + ClassParser parser = new ClassParser("force"); + } catch (IOException e) { + // ignore + } + } + /** * Determine the dependencies of the configured root classes. * diff --git a/src/main/org/apache/tools/ant/util/depend/bcel/FullAnalyzer.java b/src/main/org/apache/tools/ant/util/depend/bcel/FullAnalyzer.java index 4f9786fcd..b4b289ba0 100644 --- a/src/main/org/apache/tools/ant/util/depend/bcel/FullAnalyzer.java +++ b/src/main/org/apache/tools/ant/util/depend/bcel/FullAnalyzer.java @@ -69,6 +69,15 @@ import org.apache.tools.ant.util.depend.AbstractAnalyzer; * @author Holger Engels */ public class FullAnalyzer extends AbstractAnalyzer { + public FullAnalyzer() { + // force BCEL classes to load now + try { + ClassParser parser = new ClassParser("force"); + } catch (IOException e) { + // ignore + } + } + /** * Determine the dependencies of the configured root classes. *