You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by mw...@apache.org on 2017/03/22 13:49:44 UTC
accumulo git commit: ACCUMULO-4604 Improve 'accumulo classpath'
command
Repository: accumulo
Updated Branches:
refs/heads/master cf69e3f67 -> c2778b8af
ACCUMULO-4604 Improve 'accumulo classpath' command
* Default output is now colon seperated jars on one line
* Added '-d' option to print old human readable format
* Improved usage for accumulo script commands
Project: http://git-wip-us.apache.org/repos/asf/accumulo/repo
Commit: http://git-wip-us.apache.org/repos/asf/accumulo/commit/c2778b8a
Tree: http://git-wip-us.apache.org/repos/asf/accumulo/tree/c2778b8a
Diff: http://git-wip-us.apache.org/repos/asf/accumulo/diff/c2778b8a
Branch: refs/heads/master
Commit: c2778b8afaacb3c548b14993d5a6ae919adfe39b
Parents: cf69e3f
Author: Mike Walch <mw...@apache.org>
Authored: Fri Mar 10 15:27:21 2017 -0500
Committer: Mike Walch <mw...@apache.org>
Committed: Wed Mar 22 09:48:08 2017 -0400
----------------------------------------------------------------------
assemble/bin/accumulo | 5 +-
assemble/conf/templates/accumulo-env.sh | 2 +-
.../accumulo/core/file/rfile/PrintInfo.java | 2 +-
.../apache/accumulo/core/util/Classpath.java | 14 ++++-
.../apache/accumulo/core/util/CreateToken.java | 2 +-
docs/src/main/asciidoc/chapters/clients.txt | 18 +++---
.../apache/accumulo/server/init/Initialize.java | 2 +-
.../org/apache/accumulo/server/util/Admin.java | 2 +-
.../shell/commands/ClasspathCommand.java | 16 ++----
.../java/org/apache/accumulo/start/Main.java | 2 +-
.../classloader/vfs/AccumuloVFSClassLoader.java | 59 +++++++++++++-------
.../classloader/vfs/AccumuloClasspathTest.java | 48 ++++++++++++++++
12 files changed, 122 insertions(+), 50 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/accumulo/blob/c2778b8a/assemble/bin/accumulo
----------------------------------------------------------------------
diff --git a/assemble/bin/accumulo b/assemble/bin/accumulo
index bbd2b91..5dd96e2 100755
--- a/assemble/bin/accumulo
+++ b/assemble/bin/accumulo
@@ -83,10 +83,7 @@ function main() {
CLASSPATH="${conf}:${lib}/*:${CLASSPATH}"
export CLASSPATH
- exec "${JAVA[@]}" \
- "${JAVA_OPTS[@]}" \
- org.apache.accumulo.start.Main \
- "$@"
+ exec "${JAVA[@]}" "${JAVA_OPTS[@]}" org.apache.accumulo.start.Main "$@"
}
main "$@"
http://git-wip-us.apache.org/repos/asf/accumulo/blob/c2778b8a/assemble/conf/templates/accumulo-env.sh
----------------------------------------------------------------------
diff --git a/assemble/conf/templates/accumulo-env.sh b/assemble/conf/templates/accumulo-env.sh
index 2985402..64b8294 100644
--- a/assemble/conf/templates/accumulo-env.sh
+++ b/assemble/conf/templates/accumulo-env.sh
@@ -51,7 +51,7 @@ JAVA_OPTS=("${ACCUMULO_JAVA_OPTS[@]}"
"-Daccumulo.native.lib.path=${lib}/native")
## Make sure Accumulo native libraries are built since they are enabled by default
-${bin}/accumulo-util build-native &> /dev/null
+"${bin}"/accumulo-util build-native &> /dev/null
## JVM options set for individual applications
case "$cmd" in
http://git-wip-us.apache.org/repos/asf/accumulo/blob/c2778b8a/core/src/main/java/org/apache/accumulo/core/file/rfile/PrintInfo.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/accumulo/core/file/rfile/PrintInfo.java b/core/src/main/java/org/apache/accumulo/core/file/rfile/PrintInfo.java
index d17528c..b947a7e 100644
--- a/core/src/main/java/org/apache/accumulo/core/file/rfile/PrintInfo.java
+++ b/core/src/main/java/org/apache/accumulo/core/file/rfile/PrintInfo.java
@@ -124,7 +124,7 @@ public class PrintInfo implements KeywordExecutable {
@Override
public void execute(final String[] args) throws Exception {
Opts opts = new Opts();
- opts.parseArgs(PrintInfo.class.getName(), args);
+ opts.parseArgs("accumulo rfile-info", args);
if (opts.files.isEmpty()) {
System.err.println("No files were given");
System.exit(-1);
http://git-wip-us.apache.org/repos/asf/accumulo/blob/c2778b8a/core/src/main/java/org/apache/accumulo/core/util/Classpath.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/accumulo/core/util/Classpath.java b/core/src/main/java/org/apache/accumulo/core/util/Classpath.java
index 40f5ac7..66adb64 100644
--- a/core/src/main/java/org/apache/accumulo/core/util/Classpath.java
+++ b/core/src/main/java/org/apache/accumulo/core/util/Classpath.java
@@ -16,6 +16,7 @@
*/
package org.apache.accumulo.core.util;
+import com.beust.jcommander.Parameter;
import org.apache.accumulo.start.Main;
import org.apache.accumulo.start.spi.KeywordExecutable;
@@ -23,6 +24,13 @@ import com.google.auto.service.AutoService;
@AutoService(KeywordExecutable.class)
public class Classpath implements KeywordExecutable {
+
+ static class Opts extends org.apache.accumulo.core.cli.Help {
+
+ @Parameter(names = {"-d", "--debug"}, description = "Turns on debugging")
+ public boolean debug = false;
+ }
+
@Override
public String keyword() {
return "classpath";
@@ -35,6 +43,10 @@ public class Classpath implements KeywordExecutable {
@Override
public void execute(final String[] args) throws Exception {
- Main.getVFSClassLoader().getMethod("printClassPath").invoke(Main.getVFSClassLoader());
+
+ Opts opts = new Opts();
+ opts.parseArgs("accumulo classpath", args);
+
+ Main.getVFSClassLoader().getMethod("printClassPath", boolean.class).invoke(Main.getVFSClassLoader(), opts.debug);
}
}
http://git-wip-us.apache.org/repos/asf/accumulo/blob/c2778b8a/core/src/main/java/org/apache/accumulo/core/util/CreateToken.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/accumulo/core/util/CreateToken.java b/core/src/main/java/org/apache/accumulo/core/util/CreateToken.java
index 005b5ba..d51ba28 100644
--- a/core/src/main/java/org/apache/accumulo/core/util/CreateToken.java
+++ b/core/src/main/java/org/apache/accumulo/core/util/CreateToken.java
@@ -85,7 +85,7 @@ public class CreateToken implements KeywordExecutable {
@Override
public void execute(String[] args) {
Opts opts = new Opts();
- opts.parseArgs(CreateToken.class.getName(), args);
+ opts.parseArgs("accumulo create-token", args);
Password pass = opts.password;
if (pass == null && opts.securePassword != null) {
http://git-wip-us.apache.org/repos/asf/accumulo/blob/c2778b8a/docs/src/main/asciidoc/chapters/clients.txt
----------------------------------------------------------------------
diff --git a/docs/src/main/asciidoc/chapters/clients.txt b/docs/src/main/asciidoc/chapters/clients.txt
index 6e0909b..a18ab91 100644
--- a/docs/src/main/asciidoc/chapters/clients.txt
+++ b/docs/src/main/asciidoc/chapters/clients.txt
@@ -26,15 +26,15 @@ of the different ways to execute client code.
==== Using the java command
-To run Accumulo client code using the +java+ command, you will need to
-include the jars that Accumulo depends on in your classpath. Accumulo client
-code depends on Hadoop and Zookeeper. For Hadoop add the hadoop client jar, all
-of the jars in the Hadoop lib directory, and the conf directory to the
-classpath. For recent Zookeeper versions, you only need to add the Zookeeper jar, and not
-what is in the Zookeeper lib directory. You can run the following command on a
-configured Accumulo system to see what its using for its classpath.
-
- accumulo classpath
+To run Accumulo client code using the +java+ command, use the +accumulo classpath+ command
+to include all of Accumulo's dependencies on your classpath:
+
+ java -classpath /path/to/my.jar:/path/to/dep.jar:$(accumulo classpath) com.my.Main arg1 arg2
+
+If you would like to review which jars are included, the +accumulo classpath+ command can
+output a more human readable format using the +-d+ option which enables debugging:
+
+ accumulo classpath -d
==== Using the accumulo command
http://git-wip-us.apache.org/repos/asf/accumulo/blob/c2778b8a/server/base/src/main/java/org/apache/accumulo/server/init/Initialize.java
----------------------------------------------------------------------
diff --git a/server/base/src/main/java/org/apache/accumulo/server/init/Initialize.java b/server/base/src/main/java/org/apache/accumulo/server/init/Initialize.java
index 35f18c6..347ac87 100644
--- a/server/base/src/main/java/org/apache/accumulo/server/init/Initialize.java
+++ b/server/base/src/main/java/org/apache/accumulo/server/init/Initialize.java
@@ -758,7 +758,7 @@ public class Initialize implements KeywordExecutable {
@Override
public void execute(final String[] args) {
Opts opts = new Opts();
- opts.parseArgs(Initialize.class.getName(), args);
+ opts.parseArgs("accumulo init", args);
try {
zoo = ZooReaderWriter.getInstance();
http://git-wip-us.apache.org/repos/asf/accumulo/blob/c2778b8a/server/base/src/main/java/org/apache/accumulo/server/util/Admin.java
----------------------------------------------------------------------
diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/Admin.java b/server/base/src/main/java/org/apache/accumulo/server/util/Admin.java
index b5bb118..a333c08 100644
--- a/server/base/src/main/java/org/apache/accumulo/server/util/Admin.java
+++ b/server/base/src/main/java/org/apache/accumulo/server/util/Admin.java
@@ -169,7 +169,7 @@ public class Admin implements KeywordExecutable {
AdminOpts opts = new AdminOpts();
JCommander cl = new JCommander(opts);
- cl.setProgramName(Admin.class.getName());
+ cl.setProgramName("accumulo admin");
CheckTabletsCommand checkTabletsCommand = new CheckTabletsCommand();
cl.addCommand("checkTablets", checkTabletsCommand);
http://git-wip-us.apache.org/repos/asf/accumulo/blob/c2778b8a/shell/src/main/java/org/apache/accumulo/shell/commands/ClasspathCommand.java
----------------------------------------------------------------------
diff --git a/shell/src/main/java/org/apache/accumulo/shell/commands/ClasspathCommand.java b/shell/src/main/java/org/apache/accumulo/shell/commands/ClasspathCommand.java
index 071571c..0cd1181 100644
--- a/shell/src/main/java/org/apache/accumulo/shell/commands/ClasspathCommand.java
+++ b/shell/src/main/java/org/apache/accumulo/shell/commands/ClasspathCommand.java
@@ -23,23 +23,19 @@ import jline.console.ConsoleReader;
import org.apache.accumulo.shell.Shell;
import org.apache.accumulo.shell.Shell.Command;
import org.apache.accumulo.start.classloader.vfs.AccumuloVFSClassLoader;
-import org.apache.accumulo.start.classloader.vfs.AccumuloVFSClassLoader.Printer;
import org.apache.commons.cli.CommandLine;
public class ClasspathCommand extends Command {
@Override
public int execute(final String fullCommand, final CommandLine cl, final Shell shellState) {
final ConsoleReader reader = shellState.getReader();
- AccumuloVFSClassLoader.printClassPath(new Printer() {
- @Override
- public void print(String s) {
- try {
- reader.println(s);
- } catch (IOException ex) {
- throw new RuntimeException(ex);
- }
+ AccumuloVFSClassLoader.printClassPath(s -> {
+ try {
+ reader.print(s);
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
}
- });
+ }, true);
return 0;
}
http://git-wip-us.apache.org/repos/asf/accumulo/blob/c2778b8a/start/src/main/java/org/apache/accumulo/start/Main.java
----------------------------------------------------------------------
diff --git a/start/src/main/java/org/apache/accumulo/start/Main.java b/start/src/main/java/org/apache/accumulo/start/Main.java
index ea2e1b8..f4c954d 100644
--- a/start/src/main/java/org/apache/accumulo/start/Main.java
+++ b/start/src/main/java/org/apache/accumulo/start/Main.java
@@ -205,7 +205,7 @@ public class Main {
public static void printUsage() {
Map<String,KeywordExecutable> executableMap = new TreeMap<>(getExecutables(getClassLoader()));
- System.out.println("\nUsage: accumulo <command> (<argument> ...)\n\nCore Commands:");
+ System.out.println("\nUsage: accumulo <command> [-h] (<argument> ...)\n\n -h Prints usage for specified command\n\nCore Commands:");
for (String cmd : Arrays.asList("init", "shell", "classpath", "version", "admin", "info", "help")) {
printCommand(executableMap.remove(cmd));
}
http://git-wip-us.apache.org/repos/asf/accumulo/blob/c2778b8a/start/src/main/java/org/apache/accumulo/start/classloader/vfs/AccumuloVFSClassLoader.java
----------------------------------------------------------------------
diff --git a/start/src/main/java/org/apache/accumulo/start/classloader/vfs/AccumuloVFSClassLoader.java b/start/src/main/java/org/apache/accumulo/start/classloader/vfs/AccumuloVFSClassLoader.java
index 8e6a84b..fbc4a99 100644
--- a/start/src/main/java/org/apache/accumulo/start/classloader/vfs/AccumuloVFSClassLoader.java
+++ b/start/src/main/java/org/apache/accumulo/start/classloader/vfs/AccumuloVFSClassLoader.java
@@ -283,16 +283,27 @@ public class AccumuloVFSClassLoader {
void print(String s);
}
- public static void printClassPath() {
- printClassPath(new Printer() {
- @Override
- public void print(String s) {
- System.out.println(s);
- }
- });
+ public static void printClassPath(boolean debug) {
+ printClassPath(System.out::print, debug);
+ }
+
+ public static String getClassPath(boolean debug) {
+ StringBuilder cp = new StringBuilder();
+ printClassPath(s -> cp.append(s), debug);
+ return cp.toString();
}
- public static void printClassPath(Printer out) {
+ private static void printJar(Printer out, String jarPath, boolean debug, boolean sawFirst) {
+ if (debug)
+ out.print("\t");
+ if (!debug && sawFirst)
+ out.print(":");
+ out.print(jarPath);
+ if (debug)
+ out.print("\n");
+ }
+
+ public static void printClassPath(Printer out, boolean debug) {
try {
ClassLoader cl = getClassLoader();
ArrayList<ClassLoader> classloaders = new ArrayList<>();
@@ -307,12 +318,17 @@ public class AccumuloVFSClassLoader {
int level = 0;
for (ClassLoader classLoader : classloaders) {
- if (level > 0)
- out.print("");
+
level++;
- String classLoaderDescription;
+ if (debug && level > 1) {
+ out.print("\n");
+ }
+ if (!debug && level < 2) {
+ continue;
+ }
+ String classLoaderDescription;
switch (level) {
case 1:
classLoaderDescription = level + ": Java System Classloader (loads Java system resources)";
@@ -332,25 +348,28 @@ public class AccumuloVFSClassLoader {
break;
}
+ boolean sawFirst = false;
if (classLoader instanceof URLClassLoader) {
- // If VFS class loader enabled, but no contexts defined.
- out.print("Level " + classLoaderDescription + " URL classpath items are:");
-
+ if (debug)
+ out.print("Level " + classLoaderDescription + " URL classpath items are:\n");
for (URL u : ((URLClassLoader) classLoader).getURLs()) {
- out.print("\t" + u.toExternalForm());
+ printJar(out, u.getFile(), debug, sawFirst);
+ sawFirst = true;
}
-
} else if (classLoader instanceof VFSClassLoader) {
- out.print("Level " + classLoaderDescription + " VFS classpaths items are:");
+ if (debug)
+ out.print("Level " + classLoaderDescription + " VFS classpaths items are:\n");
VFSClassLoader vcl = (VFSClassLoader) classLoader;
for (FileObject f : vcl.getFileObjects()) {
- out.print("\t" + f.getURL().toExternalForm());
+ printJar(out, f.getURL().getFile(), debug, sawFirst);
+ sawFirst = true;
}
} else {
- out.print("Unknown classloader configuration " + classLoader.getClass());
+ if (debug)
+ out.print("Unknown classloader configuration " + classLoader.getClass() + "\n");
}
}
-
+ out.print("\n");
} catch (Throwable t) {
throw new RuntimeException(t);
}
http://git-wip-us.apache.org/repos/asf/accumulo/blob/c2778b8a/start/src/test/java/org/apache/accumulo/start/classloader/vfs/AccumuloClasspathTest.java
----------------------------------------------------------------------
diff --git a/start/src/test/java/org/apache/accumulo/start/classloader/vfs/AccumuloClasspathTest.java b/start/src/test/java/org/apache/accumulo/start/classloader/vfs/AccumuloClasspathTest.java
new file mode 100644
index 0000000..4925d67
--- /dev/null
+++ b/start/src/test/java/org/apache/accumulo/start/classloader/vfs/AccumuloClasspathTest.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.accumulo.start.classloader.vfs;
+
+import static org.apache.accumulo.start.classloader.vfs.AccumuloVFSClassLoader.getClassPath;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class AccumuloClasspathTest {
+
+ private static void assertPattern(String output, String pattern, boolean shouldMatch) {
+ if (shouldMatch) {
+ Assert.assertTrue("Pattern " + pattern + " did not match output: " + output,
+ output.matches(pattern));
+ } else {
+ Assert.assertFalse("Pattern " + pattern + " should not match output: " + output,
+ output.matches(pattern));
+ }
+ }
+
+ @Test
+ public void basic() {
+ assertPattern(getClassPath(true), "(?s).*\\s+.*\\n$", true);
+ Assert.assertTrue(getClassPath(true).contains("Java System Classloader"));
+ Assert.assertTrue(getClassPath(true).contains("Level"));
+
+ Assert.assertTrue(getClassPath(true).length() > getClassPath(false).length());
+
+ assertPattern(getClassPath(false), "(?s).*\\s+.*\\n$", false);
+ Assert.assertFalse(getClassPath(false).contains("Java System Classloader"));
+ Assert.assertFalse(getClassPath(false).contains("Level"));
+ }
+}