提交 12a6372d 编写于 作者: O ohair

6933622: Duplicate class files in rt.jar and charsets.jar

6895003: JarReorder is not excluding a requested file.
Reviewed-by: jjg
上级 6f42644e
...@@ -549,6 +549,7 @@ DIRDIFF_JARFILE = $(BUILDTOOLJARDIR)/dirdiff.jar ...@@ -549,6 +549,7 @@ DIRDIFF_JARFILE = $(BUILDTOOLJARDIR)/dirdiff.jar
###################################################### ######################################################
# List of directories in classes directory that should NOT be in rt.jar # List of directories in classes directory that should NOT be in rt.jar
# sun/nio/cs/ext/ will go into charsets.jar
###################################################### ######################################################
NOT_RT_JAR_LIST = $(ABS_TEMPDIR)/not_rt_jar.list NOT_RT_JAR_LIST = $(ABS_TEMPDIR)/not_rt_jar.list
...@@ -571,6 +572,7 @@ $(NOT_RT_JAR_LIST): FRC ...@@ -571,6 +572,7 @@ $(NOT_RT_JAR_LIST): FRC
$(ECHO) "META-INF/services/com.sun.tools.xjc.Plugin" >> $@ $(ECHO) "META-INF/services/com.sun.tools.xjc.Plugin" >> $@
$(ECHO) "com/sun/tools/" >> $@ $(ECHO) "com/sun/tools/" >> $@
$(ECHO) "sun/jvmstat/" >> $@ $(ECHO) "sun/jvmstat/" >> $@
$(ECHO) "sun/nio/cs/ext/" >> $@
$(ECHO) "sun/rmi/rmic/" >> $@ $(ECHO) "sun/rmi/rmic/" >> $@
$(ECHO) "sun/tools/asm/" >> $@ $(ECHO) "sun/tools/asm/" >> $@
$(ECHO) "sun/tools/java/" >> $@ $(ECHO) "sun/tools/java/" >> $@
......
...@@ -28,7 +28,6 @@ ...@@ -28,7 +28,6 @@
* combine with an argument list of files and directories, and * combine with an argument list of files and directories, and
* write a list of items to be included in a jar file. * write a list of items to be included in a jar file.
*/ */
package build.tools.jarreorder; package build.tools.jarreorder;
import java.io.BufferedReader; import java.io.BufferedReader;
...@@ -36,74 +35,68 @@ import java.io.File; ...@@ -36,74 +35,68 @@ import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.FileReader; import java.io.FileReader;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays; import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Vector;
import java.io.PrintStream; import java.io.PrintStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class JarReorder { public class JarReorder {
// To deal with output // To deal with output
private static PrintStream out; private PrintStream out;
private final static boolean useTopDir = false;
private static void usage() { private void usage() {
String help; String help;
help = help =
"Usage: jar JarReorder [-o <outputfile>] <order_list> <exclude_list> <file> ...\n" "Usage: jar JarReorder [-o <outputfile>] <order_list> <exclude_list> <file> ...\n"
+ " order_list is a file containing names of files to load\n" + " order_list is a file containing names of files to load\n"
+ " in order at the end of a jar file.\n" + " in order at the end of a jar file unless\n"
+ " excluded in the exclude list.\n"
+ " exclude_list is a file containing names of files/directories\n" + " exclude_list is a file containing names of files/directories\n"
+ " NOT to be included in a jar file.\n"; + " NOT to be included in a jar file.\n"
if (useTopDir) + "\n"
help += + "The order_list or exclude_list may be replaced by a \"-\" if no\n"
" top_dir is the top of the directory structure to be searched;\n"
+ " the contents of the lists and remaining arguments are\n"
+ " relative to this.\n";
help +=
"\n"
+ "The order_list or exclude_list may be replaced by a \"_\" if no\n"
+ "data is to be provided.\n" + "data is to be provided.\n"
+ "\n" + "\n"
+ " The remaining arguments are files or directories to be included\n" + " The remaining arguments are files or directories to be included\n"
+ " in a jar file, from which will be excluded thse entries which\n" + " in a jar file, from which will be excluded those entries which\n"
+ " appear in the exclude list.\n"; + " appear in the exclude list.\n";
System.err.println(help); System.err.println(help);
System.exit(1);
} }
/* /*
* Create a list of files to be included in a jar file, such that the * Create the file list to be included in a jar file, such that the
* some the files will appear in a specific order, and allowing certain * list will appear in a specific order, and allowing certain
* files and directories to be excluded. * files and directories to be excluded.
* *
* Command line arguments are * Command path arguments are
* - optional -o outputfile * - optional -o outputfile
* - name of a file containing a list of files to be included in a jar file. * - name of a file containing a set of files to be included in a jar file.
* - name of a file containing a list of files (or directories) to be * - name of a file containing a set of files (or directories) to be
* excluded from the jar file. * excluded from the jar file.
* - names of files or directories to be searched for files to include * - names of files or directories to be searched for files to include
* in the jar file. * in the jar file.
*/ */
public static void main(String[] args) { public static void main(String[] args) {
JarReorder jr = new JarReorder();
jr.run(args);
}
private void run(String args[]) {
HashMap filesExcluded = new HashMap();
Vector filesIncluded = new Vector();
int fileArgs;
String topDirName = "";
int arglen = args.length; int arglen = args.length;
int argpos = 0; int argpos = 0;
// Look for "-o outputfilename" option // Look for "-o outputfilename" option
if ( arglen > 0 ) { if (arglen > 0) {
if ( arglen >= 2 && args[0].equals("-o") ) { if (arglen >= 2 && args[0].equals("-o")) {
try { try {
out = new PrintStream(new FileOutputStream(args[1])); out = new PrintStream(new FileOutputStream(args[1]));
} catch ( FileNotFoundException e ) { } catch (FileNotFoundException e) {
System.err.println("Error: " + e.getMessage()); System.err.println("Error: " + e.getMessage());
e.printStackTrace(System.err); e.printStackTrace(System.err);
System.exit(1); System.exit(1);
...@@ -118,128 +111,111 @@ public class JarReorder { ...@@ -118,128 +111,111 @@ public class JarReorder {
out = System.out; out = System.out;
} }
fileArgs = useTopDir ? 3 : 2; // Should be 2 or more args left
if (arglen <= 2) {
if (arglen <= fileArgs) {
usage(); usage();
System.exit(1);
} }
// Read the ordered list of files to be included in rt.jar. // Read the ordered set of files to be included in rt.jar.
// Read the list of files/directories to be excluded from rt.jar. // Read the set of files/directories to be excluded from rt.jar.
String classListFile = args[argpos];
String excludeListFile = args[argpos + 1];
argpos += 2;
arglen -= 2;
Vector orderList = readListFromFile(args[argpos], true); // Create 2 lists and a set of processed files
Vector excludeList = readListFromFile(args[argpos+1], false); List<String> orderList = readListFromFile(classListFile, true);
if (useTopDir) { List<String> excludeList = readListFromFile(excludeListFile, false);
topDirName = args[argpos+2]; Set<String> processed = new HashSet<String>();
if (!topDirName.endsWith(File.separator))
topDirName = topDirName + File.separator;
}
// Copy these lists into filesExcluded so that these files will be excluded // Create set of all files and directories excluded, then expand
// from the file list. (The orderList files will be appended later.) // that list completely
Set<String> excludeSet = new HashSet<String>(excludeList);
Set<String> allFilesExcluded = expand(null, excludeSet, processed);
for (int i = 0; i < orderList.size(); ++i) { // Indicate all these have been processed, orderList too, kept to end.
String s = (String) orderList.elementAt(i); processed.addAll(orderList);
filesExcluded.put(s, s);
}
for (int i = 0; i < excludeList.size(); ++i) {
String s = (String) excludeList.elementAt(i);
filesExcluded.put(s, s);
}
// The remaining arguments are names of files/directories to be included // The remaining arguments are names of files/directories to be included
// in the jar file. // in the jar file.
Set<String> inputSet = new HashSet<String>();
String[] files = new String[arglen - fileArgs]; for (int i = 0; i < arglen; ++i) {
for (int i = fileArgs; i < arglen; ++i) { String name = args[argpos + i];
files[i-fileArgs] = args[argpos+i]; name = cleanPath(new File(name));
filesExcluded.put(args[argpos+i], args[argpos+i]); if ( name != null && name.length() > 0 && !inputSet.contains(name) ) {
inputSet.add(name);
}
} }
// Expand file/directory list to file list excluding those // Expand file/directory input so we get a complete set (except ordered)
// read from the class list. // Should be everything not excluded and not in order list.
Set<String> allFilesIncluded = expand(null, inputSet, processed);
if (useTopDir) // Create simple sorted list so we can add ordered items at end.
expand(new File(topDirName), files, filesIncluded, filesExcluded, topDirName); List<String> allFiles = new ArrayList<String>(allFilesIncluded);
else Collections.sort(allFiles);
expand(null, files, filesIncluded, filesExcluded, null);
// Now add the ordered list to the end of the expanded list. // Now add the ordered set to the end of the list.
// Add in REVERSE ORDER, so that the first element is closest to // Add in REVERSE ORDER, so that the first element is closest to
// the end (and the index). // the end (and the index).
HashSet excludeSet = new HashSet(excludeList);
for (int i = orderList.size() - 1; i >= 0; --i) { for (int i = orderList.size() - 1; i >= 0; --i) {
String s = (String) orderList.elementAt(i); String s = orderList.get(i);
if (excludeSet.contains(s)) { if (allFilesExcluded.contains(s)) {
System.err.println("Included file " + s + " is also excluded, skipping."); System.err.println("Included order file " + s
continue; + " is also excluded, skipping.");
} else if (new File(s).exists()) {
allFiles.add(s);
} else {
System.err.println("Included order file " + s
+ " missing, skipping.");
} }
if (new File(topDirName + s).exists())
filesIncluded.addElement(s);
else
System.err.println("Included file "+s+" missing, skipping.");
} }
// Print results. // Print final results.
for (String str : allFiles) {
for (int i = 0; i < filesIncluded.size(); ++i) { out.println(str);
if (useTopDir) {
out.print("-C ");
out.print(topDirName);
out.print(" ");
}
out.println((String)filesIncluded.elementAt(i));
} }
out.flush(); out.flush();
out.close(); out.close();
} }
/* /*
* Read a file containing a list of files into a Vector. * Read a file containing a list of files and directories into a List.
*/ */
private static Vector readListFromFile(String fileName, private List<String> readListFromFile(String fileName,
boolean addClassSuffix) { boolean addClassSuffix) {
BufferedReader br = null; BufferedReader br = null;
Vector v = new Vector(2000); List<String> list = new ArrayList<String>();
// If you see "-" for the name, just assume nothing was provided.
if ("-".equals(fileName)) if ("-".equals(fileName)) {
return v; return list;
}
try { try {
br = new BufferedReader(new FileReader(fileName)); br = new BufferedReader(new FileReader(fileName));
// Read the input file a path at a time. # in column 1 is a comment.
// Read the input file a line at a time. # in column 1 is a comment.
while (true) { while (true) {
String line = null; String path = br.readLine();
line = br.readLine(); if (path == null) {
if (line == null)
break; break;
}
if (line.length() == 0 || // Look for comments
line.charAt(0) == '#') path = path.trim();
if (path.length() == 0
|| path.charAt(0) == '#') {
continue; continue;
// Convert forward or back slashes to the type expected for
// the current platform.
if (File.separatorChar == '/')
line = line.replace('\\', '/');
else
line = line.replace('/', '\\');
line = line.trim();
if (addClassSuffix) {
if (!line.endsWith(".class")) {
line = line + ".class";
} }
// Add trailing .class if necessary
if (addClassSuffix && !path.endsWith(".class")) {
path = path + ".class";
}
// Normalize the path
path = cleanPath(new File(path));
// Add to list
if (path != null && path.length() > 0 && !list.contains(path)) {
list.add(path);
} }
v.addElement(line);
} }
br.close(); br.close();
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
...@@ -249,68 +225,89 @@ public class JarReorder { ...@@ -249,68 +225,89 @@ public class JarReorder {
e.printStackTrace(); e.printStackTrace();
System.exit(2); System.exit(2);
} }
return v; return list;
} }
/* /*
* Expands list of files to process into full list of all files that * Expands inputSet (files or dirs) into full set of all files that
* can be found by recursively descending directories. * can be found by recursively descending directories.
* @param dir root directory
* @param inputSet set of files or dirs to look into
* @param processed files or dirs already processed
* @return set of files
*/ */
private static void expand(File dir, String[] files, private Set<String> expand(File dir,
Vector includedFiles, HashMap excludedFiles, Set<String> inputSet,
String topDirName) { Set<String> processed) {
if (files == null) { Set<String> includedFiles = new HashSet<String>();
return; if (inputSet.isEmpty()) {
} return includedFiles;
for (int i = 0; i < files.length; i++) { }
File f = (dir == null) ? new File(files[i]) for (String name : inputSet) {
: new File(dir, files[i]); // Depending on start location
File f = (dir == null) ? new File(name)
: new File(dir, name);
// Normalized path to use
String path = cleanPath(f);
if (path != null && path.length() > 0
&& !processed.contains(path)) {
if (f.isFile()) { if (f.isFile()) {
String filePath = f.getPath(); // Not in the excludeList, add it to both lists
includedFiles.add(path);
if (useTopDir) { processed.add(path);
if (filePath.startsWith(topDirName)) } else if (f.isDirectory()) {
filePath = filePath.substring(topDirName.length()); // Add the directory entries
String[] dirList = f.list();
Set<String> dirInputSet = new HashSet<String>();
for (String x : dirList) {
dirInputSet.add(x);
} }
// Process all entries in this directory
if (filePath.length() >= 2 && Set<String> subList = expand(f, dirInputSet, processed);
filePath.charAt(0) == '.' && includedFiles.addAll(subList);
filePath.charAt(1) == File.separatorChar) processed.add(path);
filePath = filePath.substring(2);
if (!excludedFiles.containsKey(filePath)) {
excludedFiles.put(filePath, filePath);
includedFiles.addElement(filePath);
} }
} else if (f.isDirectory()) { }
String dirPath = f.getPath(); }
dirPath = (dirPath.endsWith(File.separator)) ? dirPath : return includedFiles;
(dirPath + File.separator);
if (useTopDir) {
if (dirPath.startsWith(topDirName))
dirPath = dirPath.substring(topDirName.length());
} }
if (dirPath.length() >= 2 && private String cleanPath(File f) {
dirPath.charAt(0) == '.' && String path = f.getPath();
dirPath.charAt(1) == File.separatorChar) if (f.isFile()) {
dirPath = dirPath.substring(2); path = cleanFilePath(path);
} else if (f.isDirectory()) {
if (!excludedFiles.containsKey(dirPath)) { path = cleanDirPath(path);
} else {
// Sort the directory list so that entries in the jar file System.err.println("WARNING: Path does not exist as file or directory: " + path);
// are in a repeatable order. The order itself is not particularly path = null;
// important. [File.list() is unpredictable.] }
return path;
String[] dirList = f.list();
Arrays.sort(dirList);
expand(f, dirList, includedFiles, excludedFiles, topDirName);
} }
private String cleanFilePath(String path) {
// Remove leading and trailing whitespace
path = path.trim();
// Make all / and \ chars one
if (File.separatorChar == '/') {
path = path.replace('\\', '/');
} else { } else {
System.err.println("Error accessing: " + f.getPath()); path = path.replace('/', '\\');
} }
// Remove leading ./
if (path.startsWith("." + File.separator)) {
path = path.substring(2);
} }
return path;
} }
private String cleanDirPath(String path) {
path = cleanFilePath(path);
// Make sure it ends with a file separator
if (!path.endsWith(File.separator)) {
path = path + File.separator;
}
return path;
}
} }
...@@ -586,9 +586,6 @@ java/nio/channels/ServerSocketChannel/AdaptServerSocket.java windows-all ...@@ -586,9 +586,6 @@ java/nio/channels/ServerSocketChannel/AdaptServerSocket.java windows-all
java/nio/channels/SocketChannel/ConnectState.java windows-all java/nio/channels/SocketChannel/ConnectState.java windows-all
java/nio/channels/SocketChannel/FinishConnect.java windows-all java/nio/channels/SocketChannel/FinishConnect.java windows-all
# Fails on all platforms due to overlap of JDK jar file contents:
sun/nio/cs/Test4200310.sh generic-all
############################################################################ ############################################################################
# jdk_rmi # jdk_rmi
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册