in src/main/org/apache/tools/ant/Main.java [309:505]
private void processArgs(final String[] args) {
String searchForThis = null;
boolean searchForFile = false;
PrintStream logTo = null;
// cycle through given args
boolean justPrintUsage = false;
boolean justPrintVersion = false;
boolean justPrintDiagnostics = false;
final ArgumentProcessorRegistry processorRegistry = ArgumentProcessorRegistry.getInstance();
for (int i = 0; i < args.length; i++) {
final String arg = args[i];
if (arg.equals("-help") || arg.equals("-h")) {
justPrintUsage = true;
} else if (arg.equals("-version")) {
justPrintVersion = true;
} else if (arg.equals("-diagnostics")) {
justPrintDiagnostics = true;
} else if (arg.equals("-quiet") || arg.equals("-q")) {
msgOutputLevel = Project.MSG_WARN;
} else if (arg.equals("-verbose") || arg.equals("-v")) {
msgOutputLevel = Project.MSG_VERBOSE;
} else if (arg.equals("-debug") || arg.equals("-d")) {
msgOutputLevel = Project.MSG_DEBUG;
} else if (arg.equals("-silent") || arg.equals("-S")) {
silent = true;
} else if (arg.equals("-noinput")) {
allowInput = false;
} else if (arg.equals("-logfile") || arg.equals("-l")) {
try {
final File logFile = new File(args[i + 1]);
i++;
// life-cycle of OutputStream is controlled by
// logTo which becomes "out" and is closed in
// handleLogfile
logTo = new PrintStream(Files.newOutputStream(logFile.toPath())); //NOSONAR
isLogFileUsed = true;
} catch (final IOException ioe) {
final String msg = "Cannot write on the specified log file. "
+ "Make sure the path exists and you have write "
+ "permissions.";
throw new BuildException(msg);
} catch (final ArrayIndexOutOfBoundsException aioobe) {
final String msg = "You must specify a log file when "
+ "using the -log argument";
throw new BuildException(msg);
}
} else if (arg.equals("-buildfile") || arg.equals("-file")
|| arg.equals("-f")) {
i = handleArgBuildFile(args, i);
} else if (arg.equals("-listener")) {
i = handleArgListener(args, i);
} else if (arg.startsWith("-D")) {
i = handleArgDefine(args, i);
} else if (arg.equals("-logger")) {
i = handleArgLogger(args, i);
} else if (arg.equals("-inputhandler")) {
i = handleArgInputHandler(args, i);
} else if (arg.equals("-emacs") || arg.equals("-e")) {
emacsMode = true;
} else if (arg.equals("-projecthelp") || arg.equals("-p")) {
// set the flag to display the targets and quit
projectHelp = true;
} else if (arg.equals("-find") || arg.equals("-s")) {
searchForFile = true;
// eat up next arg if present, default to build.xml
if (i < args.length - 1) {
searchForThis = args[++i];
}
} else if (arg.startsWith("-propertyfile")) {
i = handleArgPropertyFile(args, i);
} else if (arg.equals("-k") || arg.equals("-keep-going")) {
keepGoingMode = true;
} else if (arg.equals("-nice")) {
i = handleArgNice(args, i);
} else if (LAUNCH_COMMANDS.contains(arg)) {
//catch script/ant mismatch with a meaningful message
//we could ignore it, but there are likely to be other
//version problems, so we stamp down on the configuration now
final String msg = "Ant's Main method is being handed "
+ "an option " + arg + " that is only for the launcher class."
+ "\nThis can be caused by a version mismatch between "
+ "the ant script/.bat file and Ant itself.";
throw new BuildException(msg);
} else if (arg.equals("-autoproxy")) {
proxy = true;
} else if (arg.startsWith("-")) {
boolean processed = false;
for (final ArgumentProcessor processor : processorRegistry.getProcessors()) {
final int newI = processor.readArguments(args, i);
if (newI != -1) {
List<String> extraArgs = extraArguments.computeIfAbsent(processor.getClass(), k -> new ArrayList<>());
extraArgs.addAll(Arrays.asList(args).subList(newI, args.length));
processed = true;
break;
}
}
if (!processed) {
// we don't have any more args to recognize!
final String msg = "Unknown argument: " + arg;
System.err.println(msg);
printUsage();
throw new BuildException("");
}
} else {
// if it's no other arg, it may be the target
targets.addElement(arg);
}
}
if (msgOutputLevel >= Project.MSG_VERBOSE || justPrintVersion) {
printVersion(msgOutputLevel);
}
if (justPrintUsage || justPrintVersion || justPrintDiagnostics) {
if (justPrintUsage) {
printUsage();
}
if (justPrintDiagnostics) {
Diagnostics.doReport(System.out, msgOutputLevel);
}
return;
}
// if buildFile was not specified on the command line,
if (buildFile == null) {
// but -find then search for it
if (searchForFile) {
if (searchForThis != null) {
buildFile = findBuildFile(System.getProperty("user.dir"), searchForThis);
} else {
// no search file specified: so search an existing default file
final Iterator<ProjectHelper> it = ProjectHelperRepository.getInstance().getHelpers();
do {
final ProjectHelper helper = it.next();
searchForThis = helper.getDefaultBuildFile();
if (msgOutputLevel >= Project.MSG_VERBOSE) {
System.out.println("Searching the default build file: " + searchForThis);
}
buildFile = findBuildFile(System.getProperty("user.dir"), searchForThis);
} while (buildFile == null && it.hasNext());
}
if (buildFile == null) {
throw new BuildException("Could not locate a build file!");
}
} else {
// no build file specified: so search an existing default file
final Iterator<ProjectHelper> it = ProjectHelperRepository.getInstance().getHelpers();
do {
final ProjectHelper helper = it.next();
buildFile = new File(helper.getDefaultBuildFile());
if (msgOutputLevel >= Project.MSG_VERBOSE) {
System.out.println("Trying the default build file: " + buildFile);
}
} while (!buildFile.exists() && it.hasNext());
}
}
// make sure buildfile exists
if (!buildFile.exists()) {
System.out.println("Buildfile: " + buildFile + " does not exist!");
throw new BuildException("Build failed");
}
if (buildFile.isDirectory()) {
final File whatYouMeant = new File(buildFile, "build.xml");
if (whatYouMeant.isFile()) {
buildFile = whatYouMeant;
} else {
System.out.println("What? Buildfile: " + buildFile + " is a dir!");
throw new BuildException("Build failed");
}
}
// Normalize buildFile for re-import detection
buildFile =
FileUtils.getFileUtils().normalize(buildFile.getAbsolutePath());
// Load the property files specified by -propertyfile
loadPropertyFiles();
if (msgOutputLevel >= Project.MSG_INFO) {
System.out.println("Buildfile: " + buildFile);
}
if (logTo != null) {
out = logTo;
err = logTo;
System.setOut(out);
System.setErr(err);
}
readyToRun = true;
}