8172432: jar cleanup/update for module and mrm jar
8171830: jar tool should validate if any exported or open package is missing Reviewed-by: mchung, psandoz, chegar
This commit is contained in:
parent
af7457dbb8
commit
cb9f76175c
jdk
src/jdk.jartool/share/classes/sun/tools/jar
test/tools/jar
mmrjar
modularJar
multiRelease
@ -169,9 +169,9 @@ class GNUStyleOptions {
|
|||||||
new Option(true, OptionType.CREATE_UPDATE, "--warn-if-resolved") {
|
new Option(true, OptionType.CREATE_UPDATE, "--warn-if-resolved") {
|
||||||
void process(Main jartool, String opt, String arg) throws BadArgs {
|
void process(Main jartool, String opt, String arg) throws BadArgs {
|
||||||
ModuleResolution mres = ModuleResolution.empty();
|
ModuleResolution mres = ModuleResolution.empty();
|
||||||
if (jartool.moduleResolution.doNotResolveByDefault())
|
if (jartool.moduleResolution.doNotResolveByDefault()) {
|
||||||
mres.withDoNotResolveByDefault();
|
mres.withDoNotResolveByDefault();
|
||||||
|
}
|
||||||
if (arg.equals("deprecated")) {
|
if (arg.equals("deprecated")) {
|
||||||
jartool.moduleResolution = mres.withDeprecated();
|
jartool.moduleResolution = mres.withDeprecated();
|
||||||
} else if (arg.equals("deprecated-for-removal")) {
|
} else if (arg.equals("deprecated-for-removal")) {
|
||||||
@ -201,26 +201,27 @@ class GNUStyleOptions {
|
|||||||
// Other options
|
// Other options
|
||||||
new Option(true, true, OptionType.OTHER, "--help", "-h") {
|
new Option(true, true, OptionType.OTHER, "--help", "-h") {
|
||||||
void process(Main jartool, String opt, String arg) throws BadArgs {
|
void process(Main jartool, String opt, String arg) throws BadArgs {
|
||||||
if (arg == null) {
|
if (jartool.info == null) {
|
||||||
jartool.info = Main.Info.HELP;
|
if (arg == null) {
|
||||||
return;
|
jartool.info = GNUStyleOptions::printHelp; // Main.Info.HELP;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!arg.equals("compat"))
|
||||||
|
throw new BadArgs("error.illegal.option", arg).showUsage(true);
|
||||||
|
// jartool.info = Main.Info.COMPAT_HELP;
|
||||||
|
jartool.info = GNUStyleOptions::printCompatHelp;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!arg.equals("compat"))
|
|
||||||
throw new BadArgs("error.illegal.option", arg).showUsage(true);
|
|
||||||
|
|
||||||
jartool.info = Main.Info.COMPAT_HELP;
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
new Option(false, OptionType.OTHER, "--help-extra") {
|
new Option(false, OptionType.OTHER, "--help-extra") {
|
||||||
void process(Main jartool, String opt, String arg) throws BadArgs {
|
void process(Main jartool, String opt, String arg) throws BadArgs {
|
||||||
jartool.info = Main.Info.HELP_EXTRA;
|
jartool.info = GNUStyleOptions::printHelpExtra;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
new Option(false, OptionType.OTHER, "--version") {
|
new Option(false, OptionType.OTHER, "--version") {
|
||||||
void process(Main jartool, String opt, String arg) {
|
void process(Main jartool, String opt, String arg) {
|
||||||
if (jartool.info == null)
|
if (jartool.info == null)
|
||||||
jartool.info = Main.Info.VERSION;
|
jartool.info = GNUStyleOptions::printVersion;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -279,14 +280,14 @@ class GNUStyleOptions {
|
|||||||
static int parseOptions(Main jartool, String[] args) throws BadArgs {
|
static int parseOptions(Main jartool, String[] args) throws BadArgs {
|
||||||
int count = 0;
|
int count = 0;
|
||||||
if (args.length == 0) {
|
if (args.length == 0) {
|
||||||
jartool.info = Main.Info.USAGE_TRYHELP;
|
jartool.info = GNUStyleOptions::printUsageTryHelp; // never be here
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// process options
|
// process options
|
||||||
for (; count < args.length; count++) {
|
for (; count < args.length; count++) {
|
||||||
if (args[count].charAt(0) != '-' || args[count].equals("-C")
|
if (args[count].charAt(0) != '-' || args[count].equals("-C") ||
|
||||||
|| args[count].equals("--release"))
|
args[count].equals("--release"))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
String name = args[count];
|
String name = args[count];
|
||||||
@ -322,15 +323,15 @@ class GNUStyleOptions {
|
|||||||
throw new BadArgs("error.unrecognized.option", name).showUsage(true);
|
throw new BadArgs("error.unrecognized.option", name).showUsage(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void printHelp(PrintWriter out) {
|
|
||||||
printHelp(out, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void printHelpExtra(PrintWriter out) {
|
static void printHelpExtra(PrintWriter out) {
|
||||||
printHelp(out, true);
|
printHelp0(out, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void printHelp(PrintWriter out, boolean printExtra) {
|
static void printHelp(PrintWriter out) {
|
||||||
|
printHelp0(out, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void printHelp0(PrintWriter out, boolean printExtra) {
|
||||||
out.format("%s%n", Main.getMsg("main.help.preopt"));
|
out.format("%s%n", Main.getMsg("main.help.preopt"));
|
||||||
for (OptionType type : OptionType.values()) {
|
for (OptionType type : OptionType.values()) {
|
||||||
boolean typeHeadingWritten = false;
|
boolean typeHeadingWritten = false;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -25,33 +25,121 @@
|
|||||||
|
|
||||||
package sun.tools.jar;
|
package sun.tools.jar;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.lang.module.InvalidModuleDescriptorException;
|
||||||
|
import java.lang.module.ModuleDescriptor;
|
||||||
|
import java.lang.module.ModuleDescriptor.Exports;
|
||||||
|
import java.lang.module.InvalidModuleDescriptorException;
|
||||||
|
import java.lang.module.ModuleDescriptor.Opens;
|
||||||
|
import java.lang.module.ModuleDescriptor.Provides;
|
||||||
|
import java.lang.module.ModuleDescriptor.Requires;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.jar.JarEntry;
|
import java.util.jar.JarEntry;
|
||||||
import java.util.jar.JarFile;
|
import java.util.jar.JarFile;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
|
||||||
final class Validator implements Consumer<JarEntry> {
|
import static java.util.jar.JarFile.MANIFEST_NAME;
|
||||||
|
import static sun.tools.jar.Main.VERSIONS_DIR;
|
||||||
|
import static sun.tools.jar.Main.MODULE_INFO;
|
||||||
|
import static sun.tools.jar.Main.getMsg;
|
||||||
|
import static sun.tools.jar.Main.formatMsg;
|
||||||
|
import static sun.tools.jar.Main.formatMsg2;
|
||||||
|
import static sun.tools.jar.Main.toBinaryName;
|
||||||
|
import static sun.tools.jar.Main.isModuleInfoEntry;
|
||||||
|
|
||||||
|
final class Validator {
|
||||||
private final static boolean DEBUG = Boolean.getBoolean("jar.debug");
|
private final static boolean DEBUG = Boolean.getBoolean("jar.debug");
|
||||||
private final Map<String,FingerPrint> fps = new HashMap<>();
|
private final Map<String,FingerPrint> fps = new HashMap<>();
|
||||||
private final int vdlen = Main.VERSIONS_DIR.length();
|
private static final int vdlen = VERSIONS_DIR.length();
|
||||||
private final Main main;
|
private final Main main;
|
||||||
private final JarFile jf;
|
private final JarFile jf;
|
||||||
private int oldVersion = -1;
|
private int oldVersion = -1;
|
||||||
private String currentTopLevelName;
|
private String currentTopLevelName;
|
||||||
private boolean isValid = true;
|
private boolean isValid = true;
|
||||||
|
private Set<String> concealedPkgs;
|
||||||
|
private ModuleDescriptor md;
|
||||||
|
|
||||||
Validator(Main main, JarFile jf) {
|
private Validator(Main main, JarFile jf) {
|
||||||
this.main = main;
|
this.main = main;
|
||||||
this.jf = jf;
|
this.jf = jf;
|
||||||
|
loadModuleDescriptor();
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean isValid() {
|
static boolean validate(Main main, File f) throws IOException {
|
||||||
return isValid;
|
return new Validator(main, new JarFile(f)).validate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean validate() {
|
||||||
|
try {
|
||||||
|
jf.stream()
|
||||||
|
.filter(e -> !e.isDirectory() &&
|
||||||
|
!e.getName().equals(MANIFEST_NAME))
|
||||||
|
.sorted(entryComparator)
|
||||||
|
.forEachOrdered(e -> validate(e));
|
||||||
|
return isValid;
|
||||||
|
} catch (InvalidJarException e) {
|
||||||
|
error(formatMsg("error.validator.bad.entry.name", e.getMessage()));
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class InvalidJarException extends RuntimeException {
|
||||||
|
private static final long serialVersionUID = -3642329147299217726L;
|
||||||
|
InvalidJarException(String msg) {
|
||||||
|
super(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// sort base entries before versioned entries, and sort entry classes with
|
||||||
|
// nested classes so that the top level class appears before the associated
|
||||||
|
// nested class
|
||||||
|
private static Comparator<JarEntry> entryComparator = (je1, je2) -> {
|
||||||
|
String s1 = je1.getName();
|
||||||
|
String s2 = je2.getName();
|
||||||
|
if (s1.equals(s2)) return 0;
|
||||||
|
boolean b1 = s1.startsWith(VERSIONS_DIR);
|
||||||
|
boolean b2 = s2.startsWith(VERSIONS_DIR);
|
||||||
|
if (b1 && !b2) return 1;
|
||||||
|
if (!b1 && b2) return -1;
|
||||||
|
int n = 0; // starting char for String compare
|
||||||
|
if (b1 && b2) {
|
||||||
|
// normally strings would be sorted so "10" goes before "9", but
|
||||||
|
// version number strings need to be sorted numerically
|
||||||
|
n = VERSIONS_DIR.length(); // skip the common prefix
|
||||||
|
int i1 = s1.indexOf('/', n);
|
||||||
|
int i2 = s1.indexOf('/', n);
|
||||||
|
if (i1 == -1) throw new InvalidJarException(s1);
|
||||||
|
if (i2 == -1) throw new InvalidJarException(s2);
|
||||||
|
// shorter version numbers go first
|
||||||
|
if (i1 != i2) return i1 - i2;
|
||||||
|
// otherwise, handle equal length numbers below
|
||||||
|
}
|
||||||
|
int l1 = s1.length();
|
||||||
|
int l2 = s2.length();
|
||||||
|
int lim = Math.min(l1, l2);
|
||||||
|
for (int k = n; k < lim; k++) {
|
||||||
|
char c1 = s1.charAt(k);
|
||||||
|
char c2 = s2.charAt(k);
|
||||||
|
if (c1 != c2) {
|
||||||
|
// change natural ordering so '.' comes before '$'
|
||||||
|
// i.e. top level classes come before nested classes
|
||||||
|
if (c1 == '$' && c2 == '.') return 1;
|
||||||
|
if (c1 == '.' && c2 == '$') return -1;
|
||||||
|
return c1 - c2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return l1 - l2;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Validator has state and assumes entries provided to accept are ordered
|
* Validator has state and assumes entries provided to accept are ordered
|
||||||
* from base entries first and then through the versioned entries in
|
* from base entries first and then through the versioned entries in
|
||||||
@ -59,7 +147,7 @@ final class Validator implements Consumer<JarEntry> {
|
|||||||
* classes must be ordered so that the top level class is before the associated
|
* classes must be ordered so that the top level class is before the associated
|
||||||
* nested class(es).
|
* nested class(es).
|
||||||
*/
|
*/
|
||||||
public void accept(JarEntry je) {
|
public void validate(JarEntry je) {
|
||||||
String entryName = je.getName();
|
String entryName = je.getName();
|
||||||
|
|
||||||
// directories are always accepted
|
// directories are always accepted
|
||||||
@ -68,13 +156,20 @@ final class Validator implements Consumer<JarEntry> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// validate the versioned module-info
|
||||||
|
if (isModuleInfoEntry(entryName)) {
|
||||||
|
if (entryName.length() != MODULE_INFO.length())
|
||||||
|
checkModuleDescriptor(je);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// figure out the version and basename from the JarEntry
|
// figure out the version and basename from the JarEntry
|
||||||
int version;
|
int version;
|
||||||
String basename;
|
String basename;
|
||||||
if (entryName.startsWith(Main.VERSIONS_DIR)) {
|
if (entryName.startsWith(VERSIONS_DIR)) {
|
||||||
int n = entryName.indexOf("/", vdlen);
|
int n = entryName.indexOf("/", vdlen);
|
||||||
if (n == -1) {
|
if (n == -1) {
|
||||||
main.error(Main.formatMsg("error.validator.version.notnumber", entryName));
|
error(formatMsg("error.validator.version.notnumber", entryName));
|
||||||
isValid = false;
|
isValid = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -82,12 +177,12 @@ final class Validator implements Consumer<JarEntry> {
|
|||||||
try {
|
try {
|
||||||
version = Integer.parseInt(v);
|
version = Integer.parseInt(v);
|
||||||
} catch (NumberFormatException x) {
|
} catch (NumberFormatException x) {
|
||||||
main.error(Main.formatMsg("error.validator.version.notnumber", entryName));
|
error(formatMsg("error.validator.version.notnumber", entryName));
|
||||||
isValid = false;
|
isValid = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (n == entryName.length()) {
|
if (n == entryName.length()) {
|
||||||
main.error(Main.formatMsg("error.validator.entryname.tooshort", entryName));
|
error(formatMsg("error.validator.entryname.tooshort", entryName));
|
||||||
isValid = false;
|
isValid = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -108,7 +203,7 @@ final class Validator implements Consumer<JarEntry> {
|
|||||||
try (InputStream is = jf.getInputStream(je)) {
|
try (InputStream is = jf.getInputStream(je)) {
|
||||||
fp = new FingerPrint(basename, is.readAllBytes());
|
fp = new FingerPrint(basename, is.readAllBytes());
|
||||||
} catch (IOException x) {
|
} catch (IOException x) {
|
||||||
main.error(x.getMessage());
|
error(x.getMessage());
|
||||||
isValid = false;
|
isValid = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -123,7 +218,7 @@ final class Validator implements Consumer<JarEntry> {
|
|||||||
fps.put(internalName, fp);
|
fps.put(internalName, fp);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
main.error(Main.formatMsg("error.validator.isolated.nested.class", entryName));
|
error(formatMsg("error.validator.isolated.nested.class", entryName));
|
||||||
isValid = false;
|
isValid = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -153,11 +248,11 @@ final class Validator implements Consumer<JarEntry> {
|
|||||||
}
|
}
|
||||||
if (fp.isPublicClass()) {
|
if (fp.isPublicClass()) {
|
||||||
if (!isConcealed(internalName)) {
|
if (!isConcealed(internalName)) {
|
||||||
main.error(Main.formatMsg("error.validator.new.public.class", entryName));
|
error(Main.formatMsg("error.validator.new.public.class", entryName));
|
||||||
isValid = false;
|
isValid = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
main.warn(Main.formatMsg("warn.validator.concealed.public.class", entryName));
|
warn(formatMsg("warn.validator.concealed.public.class", entryName));
|
||||||
debug("%s is a public class entry in a concealed package", entryName);
|
debug("%s is a public class entry in a concealed package", entryName);
|
||||||
}
|
}
|
||||||
debug("%s is a non-public class entry", entryName);
|
debug("%s is a non-public class entry", entryName);
|
||||||
@ -173,7 +268,7 @@ final class Validator implements Consumer<JarEntry> {
|
|||||||
|
|
||||||
// are the two classes/resources identical?
|
// are the two classes/resources identical?
|
||||||
if (fp.isIdentical(matchFp)) {
|
if (fp.isIdentical(matchFp)) {
|
||||||
main.warn(Main.formatMsg("warn.validator.identical.entry", entryName));
|
warn(formatMsg("warn.validator.identical.entry", entryName));
|
||||||
return; // it's okay, just takes up room
|
return; // it's okay, just takes up room
|
||||||
}
|
}
|
||||||
debug("sha1 not equal -- different bytes");
|
debug("sha1 not equal -- different bytes");
|
||||||
@ -188,12 +283,12 @@ final class Validator implements Consumer<JarEntry> {
|
|||||||
}
|
}
|
||||||
debug("%s is a class entry", entryName);
|
debug("%s is a class entry", entryName);
|
||||||
if (!fp.isCompatibleVersion(matchFp)) {
|
if (!fp.isCompatibleVersion(matchFp)) {
|
||||||
main.error(Main.formatMsg("error.validator.incompatible.class.version", entryName));
|
error(formatMsg("error.validator.incompatible.class.version", entryName));
|
||||||
isValid = false;
|
isValid = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!fp.isSameAPI(matchFp)) {
|
if (!fp.isSameAPI(matchFp)) {
|
||||||
main.error(Main.formatMsg("error.validator.different.api", entryName));
|
error(formatMsg("error.validator.different.api", entryName));
|
||||||
isValid = false;
|
isValid = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -208,17 +303,118 @@ final class Validator implements Consumer<JarEntry> {
|
|||||||
}
|
}
|
||||||
debug("%s is a resource", entryName);
|
debug("%s is a resource", entryName);
|
||||||
|
|
||||||
main.warn(Main.formatMsg("warn.validator.resources.with.same.name", entryName));
|
warn(formatMsg("warn.validator.resources.with.same.name", entryName));
|
||||||
fps.put(internalName, fp);
|
fps.put(internalName, fp);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void loadModuleDescriptor() {
|
||||||
|
ZipEntry je = jf.getEntry(MODULE_INFO);
|
||||||
|
if (je != null) {
|
||||||
|
try (InputStream jis = jf.getInputStream(je)) {
|
||||||
|
md = ModuleDescriptor.read(jis);
|
||||||
|
concealedPkgs = new HashSet<>(md.packages());
|
||||||
|
md.exports().stream().map(Exports::source).forEach(concealedPkgs::remove);
|
||||||
|
md.opens().stream().map(Opens::source).forEach(concealedPkgs::remove);
|
||||||
|
return;
|
||||||
|
} catch (Exception x) {
|
||||||
|
error(x.getMessage() + " : " + je.getName());
|
||||||
|
this.isValid = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
md = null;
|
||||||
|
concealedPkgs = Collections.emptySet();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isPlatformModule(String name) {
|
||||||
|
return name.startsWith("java.") || name.startsWith("jdk.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether or not the given versioned module descriptor's attributes
|
||||||
|
* are valid when compared against the root module descriptor.
|
||||||
|
*
|
||||||
|
* A versioned module descriptor must be identical to the root module
|
||||||
|
* descriptor, with two exceptions:
|
||||||
|
* - A versioned descriptor can have different non-public `requires`
|
||||||
|
* clauses of platform ( `java.*` and `jdk.*` ) modules, and
|
||||||
|
* - A versioned descriptor can have different `uses` clauses, even of
|
||||||
|
* service types defined outside of the platform modules.
|
||||||
|
*/
|
||||||
|
private void checkModuleDescriptor(JarEntry je) {
|
||||||
|
try (InputStream is = jf.getInputStream(je)) {
|
||||||
|
ModuleDescriptor root = this.md;
|
||||||
|
ModuleDescriptor md = null;
|
||||||
|
try {
|
||||||
|
md = ModuleDescriptor.read(is);
|
||||||
|
} catch (InvalidModuleDescriptorException x) {
|
||||||
|
error(x.getMessage());
|
||||||
|
isValid = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (root == null) {
|
||||||
|
this.md = md;
|
||||||
|
} else {
|
||||||
|
if (!root.name().equals(md.name())) {
|
||||||
|
error(getMsg("error.versioned.info.name.notequal"));
|
||||||
|
isValid = false;
|
||||||
|
}
|
||||||
|
if (!root.requires().equals(md.requires())) {
|
||||||
|
Set<Requires> rootRequires = root.requires();
|
||||||
|
for (Requires r : md.requires()) {
|
||||||
|
if (rootRequires.contains(r))
|
||||||
|
continue;
|
||||||
|
if (r.modifiers().contains(Requires.Modifier.TRANSITIVE)) {
|
||||||
|
error(getMsg("error.versioned.info.requires.transitive"));
|
||||||
|
isValid = false;
|
||||||
|
} else if (!isPlatformModule(r.name())) {
|
||||||
|
error(getMsg("error.versioned.info.requires.added"));
|
||||||
|
isValid = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (Requires r : rootRequires) {
|
||||||
|
Set<Requires> mdRequires = md.requires();
|
||||||
|
if (mdRequires.contains(r))
|
||||||
|
continue;
|
||||||
|
if (!isPlatformModule(r.name())) {
|
||||||
|
error(getMsg("error.versioned.info.requires.dropped"));
|
||||||
|
isValid = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!root.exports().equals(md.exports())) {
|
||||||
|
error(getMsg("error.versioned.info.exports.notequal"));
|
||||||
|
isValid = false;
|
||||||
|
}
|
||||||
|
if (!root.opens().equals(md.opens())) {
|
||||||
|
error(getMsg("error.versioned.info.opens.notequal"));
|
||||||
|
isValid = false;
|
||||||
|
}
|
||||||
|
if (!root.provides().equals(md.provides())) {
|
||||||
|
error(getMsg("error.versioned.info.provides.notequal"));
|
||||||
|
isValid = false;
|
||||||
|
}
|
||||||
|
if (!root.mainClass().equals(md.mainClass())) {
|
||||||
|
error(formatMsg("error.validator.info.manclass.notequal", je.getName()));
|
||||||
|
isValid = false;
|
||||||
|
}
|
||||||
|
if (!root.version().equals(md.version())) {
|
||||||
|
error(formatMsg("error.validator.info.version.notequal", je.getName()));
|
||||||
|
isValid = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException x) {
|
||||||
|
error(x.getMessage());
|
||||||
|
isValid = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private boolean checkInternalName(String entryName, String basename, String internalName) {
|
private boolean checkInternalName(String entryName, String basename, String internalName) {
|
||||||
String className = className(basename);
|
String className = className(basename);
|
||||||
if (internalName.equals(className)) {
|
if (internalName.equals(className)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
main.error(Main.formatMsg2("error.validator.names.mismatch",
|
error(formatMsg2("error.validator.names.mismatch",
|
||||||
entryName, internalName.replace("/", ".")));
|
entryName, internalName.replace("/", ".")));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -231,7 +427,7 @@ final class Validator implements Consumer<JarEntry> {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
debug("top level class was not accepted");
|
debug("top level class was not accepted");
|
||||||
main.error(Main.formatMsg("error.validator.isolated.nested.class", entryName));
|
error(formatMsg("error.validator.isolated.nested.class", entryName));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -240,16 +436,24 @@ final class Validator implements Consumer<JarEntry> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean isConcealed(String internalName) {
|
private boolean isConcealed(String internalName) {
|
||||||
if (main.concealedPackages.isEmpty()) {
|
if (concealedPkgs.isEmpty()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
int idx = internalName.lastIndexOf('/');
|
int idx = internalName.lastIndexOf('/');
|
||||||
String pkgName = idx != -1 ? internalName.substring(0, idx).replace('/', '.') : "";
|
String pkgName = idx != -1 ? internalName.substring(0, idx).replace('/', '.') : "";
|
||||||
return main.concealedPackages.contains(pkgName);
|
return concealedPkgs.contains(pkgName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void debug(String fmt, Object... args) {
|
private void debug(String fmt, Object... args) {
|
||||||
if (DEBUG) System.err.format(fmt, args);
|
if (DEBUG) System.err.format(fmt, args);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
private void error(String msg) {
|
||||||
|
main.error(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void warn(String msg) {
|
||||||
|
main.warn(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -66,23 +66,6 @@ error.unexpected.module-info=\
|
|||||||
Unexpected module descriptor {0}
|
Unexpected module descriptor {0}
|
||||||
error.module.descriptor.not.found=\
|
error.module.descriptor.not.found=\
|
||||||
Module descriptor not found
|
Module descriptor not found
|
||||||
error.versioned.info.without.root=\
|
|
||||||
module-info.class found in a versioned directory without module-info.class \
|
|
||||||
in the root
|
|
||||||
error.versioned.info.name.notequal=\
|
|
||||||
module-info.class in a versioned directory contains incorrect name
|
|
||||||
error.versioned.info.requires.transitive=\
|
|
||||||
module-info.class in a versioned directory contains additional "requires transitive"
|
|
||||||
error.versioned.info.requires.added=\
|
|
||||||
module-info.class in a versioned directory contains additional "requires"
|
|
||||||
error.versioned.info.requires.dropped=\
|
|
||||||
module-info.class in a versioned directory contains missing "requires"
|
|
||||||
error.versioned.info.exports.notequal=\
|
|
||||||
module-info.class in a versioned directory contains different "exports"
|
|
||||||
error.versioned.info.opens.notequal=\
|
|
||||||
module-info.class in a versioned directory contains different "opens"
|
|
||||||
error.versioned.info.provides.notequal=\
|
|
||||||
module-info.class in a versioned directory contains different "provides"
|
|
||||||
error.invalid.versioned.module.attribute=\
|
error.invalid.versioned.module.attribute=\
|
||||||
Invalid module descriptor attribute {0}
|
Invalid module descriptor attribute {0}
|
||||||
error.missing.provider=\
|
error.missing.provider=\
|
||||||
@ -113,6 +96,24 @@ error.validator.different.api=\
|
|||||||
entry: {0}, contains a class with different api from earlier version
|
entry: {0}, contains a class with different api from earlier version
|
||||||
error.validator.names.mismatch=\
|
error.validator.names.mismatch=\
|
||||||
entry: {0}, contains a class with internal name {1}, names do not match
|
entry: {0}, contains a class with internal name {1}, names do not match
|
||||||
|
error.validator.info.name.notequal=\
|
||||||
|
module-info.class in a versioned directory contains incorrect name
|
||||||
|
error.validator.info.requires.transitive=\
|
||||||
|
module-info.class in a versioned directory contains additional "requires transitive"
|
||||||
|
error.validator.info.requires.added=\
|
||||||
|
module-info.class in a versioned directory contains additional "requires"
|
||||||
|
error.validator.info.requires.dropped=\
|
||||||
|
module-info.class in a versioned directory contains missing "requires"
|
||||||
|
error.validator.info.exports.notequal=\
|
||||||
|
module-info.class in a versioned directory contains different "exports"
|
||||||
|
error.validator.info.opens.notequal=\
|
||||||
|
module-info.class in a versioned directory contains different "opens"
|
||||||
|
error.validator.info.provides.notequal=\
|
||||||
|
module-info.class in a versioned directory contains different "provides"
|
||||||
|
error.validator.info.version.notequal=\
|
||||||
|
{0}: module-info.class in a versioned directory contains different "version"
|
||||||
|
error.validator.info.manclass.notequal=\
|
||||||
|
{0}: module-info.class in a versioned directory contains different "main-class"
|
||||||
warn.validator.identical.entry=\
|
warn.validator.identical.entry=\
|
||||||
Warning: entry {0} contains a class that\n\
|
Warning: entry {0} contains a class that\n\
|
||||||
is identical to an entry already in the jar
|
is identical to an entry already in the jar
|
||||||
@ -122,6 +123,8 @@ warn.validator.concealed.public.class=\
|
|||||||
Warning: entry {0} is a public class\n\
|
Warning: entry {0} is a public class\n\
|
||||||
in a concealed package, placing this jar on the class path will result\n\
|
in a concealed package, placing this jar on the class path will result\n\
|
||||||
in incompatible public interfaces
|
in incompatible public interfaces
|
||||||
|
warn.release.unexpected.versioned.entry=\
|
||||||
|
unexpected versioned entry {0}
|
||||||
out.added.manifest=\
|
out.added.manifest=\
|
||||||
added manifest
|
added manifest
|
||||||
out.added.module-info=\
|
out.added.module-info=\
|
||||||
|
@ -42,13 +42,13 @@ error.hash.dep=Abh\u00E4ngigkeiten bei Hashing-Modul {0}. Modul {1} kann nicht i
|
|||||||
error.module.options.without.info=--module-version oder --hash-modules ohne module-info.class
|
error.module.options.without.info=--module-version oder --hash-modules ohne module-info.class
|
||||||
error.unexpected.module-info=Unerwarteter Moduldeskriptor {0}
|
error.unexpected.module-info=Unerwarteter Moduldeskriptor {0}
|
||||||
error.module.descriptor.not.found=Moduldeskriptor nicht gefunden
|
error.module.descriptor.not.found=Moduldeskriptor nicht gefunden
|
||||||
error.versioned.info.without.root=module-info.class in einem versionierten Verzeichnis gefunden, in der Root ist module-info.class jedoch nicht vorhanden
|
error.validator.info.without.root=module-info.class in einem versionierten Verzeichnis gefunden, in der Root ist module-info.class jedoch nicht vorhanden
|
||||||
error.versioned.info.name.notequal=module-info.class in einem versionierten Verzeichnis enth\u00E4lt falschen Namen
|
error.validator.info.name.notequal=module-info.class in einem versionierten Verzeichnis enth\u00E4lt falschen Namen
|
||||||
error.versioned.info.requires.public=module-info.class in einem versionierten Verzeichnis enth\u00E4lt zus\u00E4tzlichen "requires public"
|
error.validator.info.requires.public=module-info.class in einem versionierten Verzeichnis enth\u00E4lt zus\u00E4tzlichen "requires public"
|
||||||
error.versioned.info.requires.added=module-info.class in einem versionierten Verzeichnis enth\u00E4lt zus\u00E4tzlichen "requires"
|
error.validator.info.requires.added=module-info.class in einem versionierten Verzeichnis enth\u00E4lt zus\u00E4tzlichen "requires"
|
||||||
error.versioned.info.requires.dropped=module-info.class in einem versionierten Verzeichnis enth\u00E4lt fehlenden "requires"
|
error.validator.info.requires.dropped=module-info.class in einem versionierten Verzeichnis enth\u00E4lt fehlenden "requires"
|
||||||
error.versioned.info.exports.notequal=module-info.class in einem versionierten Verzeichnis enth\u00E4lt unterschiedliche "exports"
|
error.validator.info.exports.notequal=module-info.class in einem versionierten Verzeichnis enth\u00E4lt unterschiedliche "exports"
|
||||||
error.versioned.info.provides.notequal=module-info.class in einem versionierten Verzeichnis enth\u00E4lt unterschiedliche "provides"
|
error.validator.info.provides.notequal=module-info.class in einem versionierten Verzeichnis enth\u00E4lt unterschiedliche "provides"
|
||||||
error.invalid.versioned.module.attribute=Ung\u00FCltiges Moduldeskriptorattribut {0}
|
error.invalid.versioned.module.attribute=Ung\u00FCltiges Moduldeskriptorattribut {0}
|
||||||
error.missing.provider=Serviceprovider nicht gefunden: {0}
|
error.missing.provider=Serviceprovider nicht gefunden: {0}
|
||||||
error.release.value.notnumber=Release {0} nicht g\u00FCltig
|
error.release.value.notnumber=Release {0} nicht g\u00FCltig
|
||||||
|
@ -42,13 +42,13 @@ error.hash.dep=Aplicando hash a las dependencias del m\u00F3dulo {0}, no se ha e
|
|||||||
error.module.options.without.info=Uno de --module-version o -hash-modules sin module-info.class
|
error.module.options.without.info=Uno de --module-version o -hash-modules sin module-info.class
|
||||||
error.unexpected.module-info=Descriptor de m\u00F3dulo inesperado {0}
|
error.unexpected.module-info=Descriptor de m\u00F3dulo inesperado {0}
|
||||||
error.module.descriptor.not.found=No se ha encontrado el descriptor de m\u00F3dulo
|
error.module.descriptor.not.found=No se ha encontrado el descriptor de m\u00F3dulo
|
||||||
error.versioned.info.without.root=Se ha encontrado module-info.class en un directorio con versi\u00F3n sin module-info.class en la ra\u00EDz
|
error.validator.info.without.root=Se ha encontrado module-info.class en un directorio con versi\u00F3n sin module-info.class en la ra\u00EDz
|
||||||
error.versioned.info.name.notequal=module-info.class en un directorio con versi\u00F3n contiene un nombre incorrecto
|
error.validator.info.name.notequal=module-info.class en un directorio con versi\u00F3n contiene un nombre incorrecto
|
||||||
error.versioned.info.requires.public=module-info.class en un directorio con versiones contiene "requires public" adicionales
|
error.validator.info.requires.public=module-info.class en un directorio con versiones contiene "requires public" adicionales
|
||||||
error.versioned.info.requires.added=module-info.class en un directorio con versi\u00F3n contiene "requires" adicionales
|
error.validator.info.requires.added=module-info.class en un directorio con versi\u00F3n contiene "requires" adicionales
|
||||||
error.versioned.info.requires.dropped=module-info.class en un directorio con versiones contiene "requires" que faltan
|
error.validator.info.requires.dropped=module-info.class en un directorio con versiones contiene "requires" que faltan
|
||||||
error.versioned.info.exports.notequal=module-info.class en un directorio con versiones contiene "exports" diferentes
|
error.validator.info.exports.notequal=module-info.class en un directorio con versiones contiene "exports" diferentes
|
||||||
error.versioned.info.provides.notequal=module-info.class en un directorio con versiones contiene "provides" diferentes
|
error.validator.info.provides.notequal=module-info.class en un directorio con versiones contiene "provides" diferentes
|
||||||
error.invalid.versioned.module.attribute=Atributo de descriptor de m\u00F3dulo no v\u00E1lido {0}
|
error.invalid.versioned.module.attribute=Atributo de descriptor de m\u00F3dulo no v\u00E1lido {0}
|
||||||
error.missing.provider=No se ha encontrado el proveedor de servicios: {0}
|
error.missing.provider=No se ha encontrado el proveedor de servicios: {0}
|
||||||
error.release.value.notnumber=versi\u00F3n {0} no v\u00E1lida
|
error.release.value.notnumber=versi\u00F3n {0} no v\u00E1lida
|
||||||
|
@ -42,13 +42,13 @@ error.hash.dep=Hachage des d\u00E9pendances du module {0}, module {1} introuvabl
|
|||||||
error.module.options.without.info=Une des options --module-version ou --hash-modules sans module-info.class
|
error.module.options.without.info=Une des options --module-version ou --hash-modules sans module-info.class
|
||||||
error.unexpected.module-info=Descripteur de module {0} inattendu
|
error.unexpected.module-info=Descripteur de module {0} inattendu
|
||||||
error.module.descriptor.not.found=Descripteur de module introuvable
|
error.module.descriptor.not.found=Descripteur de module introuvable
|
||||||
error.versioned.info.without.root=module-info.class a \u00E9t\u00E9 d\u00E9tect\u00E9 dans un r\u00E9pertoire avec num\u00E9ro de version sans module-info.class dans la racine
|
error.validator.info.without.root=module-info.class a \u00E9t\u00E9 d\u00E9tect\u00E9 dans un r\u00E9pertoire avec num\u00E9ro de version sans module-info.class dans la racine
|
||||||
error.versioned.info.name.notequal=module-info.class dans un r\u00E9pertoire avec num\u00E9ro de version contient un nom incorrect
|
error.validator.info.name.notequal=module-info.class dans un r\u00E9pertoire avec num\u00E9ro de version contient un nom incorrect
|
||||||
error.versioned.info.requires.public=module-info.class dans un r\u00E9pertoire avec num\u00E9ro de version contient des mots-cl\u00E9s "requires public" suppl\u00E9mentaires
|
error.validator.info.requires.public=module-info.class dans un r\u00E9pertoire avec num\u00E9ro de version contient des mots-cl\u00E9s "requires public" suppl\u00E9mentaires
|
||||||
error.versioned.info.requires.added=module-info.class dans un r\u00E9pertoire avec num\u00E9ro de version contient des mots-cl\u00E9s "requires" suppl\u00E9mentaires
|
error.validator.info.requires.added=module-info.class dans un r\u00E9pertoire avec num\u00E9ro de version contient des mots-cl\u00E9s "requires" suppl\u00E9mentaires
|
||||||
error.versioned.info.requires.dropped=module-info.class dans un r\u00E9pertoire avec num\u00E9ro de version contient des mots-cl\u00E9s "requires" manquants
|
error.validator.info.requires.dropped=module-info.class dans un r\u00E9pertoire avec num\u00E9ro de version contient des mots-cl\u00E9s "requires" manquants
|
||||||
error.versioned.info.exports.notequal=module-info.class dans un r\u00E9pertoire avec num\u00E9ro de version contient des mots-cl\u00E9s "exports" diff\u00E9rents
|
error.validator.info.exports.notequal=module-info.class dans un r\u00E9pertoire avec num\u00E9ro de version contient des mots-cl\u00E9s "exports" diff\u00E9rents
|
||||||
error.versioned.info.provides.notequal=module-info.class dans un r\u00E9pertoire avec num\u00E9ro de version contient des mots-cl\u00E9s "provides" diff\u00E9rents
|
error.validator.info.provides.notequal=module-info.class dans un r\u00E9pertoire avec num\u00E9ro de version contient des mots-cl\u00E9s "provides" diff\u00E9rents
|
||||||
error.invalid.versioned.module.attribute=Attribut de descripteur de module non valide {0}
|
error.invalid.versioned.module.attribute=Attribut de descripteur de module non valide {0}
|
||||||
error.missing.provider=Fournisseur de services introuvable : {0}
|
error.missing.provider=Fournisseur de services introuvable : {0}
|
||||||
error.release.value.notnumber=version {0} non valide
|
error.release.value.notnumber=version {0} non valide
|
||||||
|
@ -42,13 +42,13 @@ error.hash.dep={0} dipendenze del modulo di hashing. Impossibile trovare il modu
|
|||||||
error.module.options.without.info=Una delle opzioni --module-version o --hash-modules non contiene module-info.class
|
error.module.options.without.info=Una delle opzioni --module-version o --hash-modules non contiene module-info.class
|
||||||
error.unexpected.module-info=Descrittore di modulo {0} imprevisto
|
error.unexpected.module-info=Descrittore di modulo {0} imprevisto
|
||||||
error.module.descriptor.not.found=Descrittore di modulo non trovato
|
error.module.descriptor.not.found=Descrittore di modulo non trovato
|
||||||
error.versioned.info.without.root=module-info.class trovato in una directory con controllo delle versioni senza module-info.class nella radice
|
error.validator.info.without.root=module-info.class trovato in una directory con controllo delle versioni senza module-info.class nella radice
|
||||||
error.versioned.info.name.notequal=module-info.class in una directory con controllo delle versioni contiene un nome errato
|
error.validator.info.name.notequal=module-info.class in una directory con controllo delle versioni contiene un nome errato
|
||||||
error.versioned.info.requires.public=module-info.class in una directory con controllo delle versioni contiene valori "requires public" aggiuntivi
|
error.validator.info.requires.public=module-info.class in una directory con controllo delle versioni contiene valori "requires public" aggiuntivi
|
||||||
error.versioned.info.requires.added=module-info.class in una directory con controllo delle versioni contiene valori "requires" aggiuntivi
|
error.validator.info.requires.added=module-info.class in una directory con controllo delle versioni contiene valori "requires" aggiuntivi
|
||||||
error.versioned.info.requires.dropped=module-info.class in una directory con controllo delle versioni contiene valori "requires" mancanti
|
error.validator.info.requires.dropped=module-info.class in una directory con controllo delle versioni contiene valori "requires" mancanti
|
||||||
error.versioned.info.exports.notequal=module-info.class in una directory con controllo delle versioni contiene "exports" differenti
|
error.validator.info.exports.notequal=module-info.class in una directory con controllo delle versioni contiene "exports" differenti
|
||||||
error.versioned.info.provides.notequal=module-info.class in una directory con controllo delle versioni contiene valori "provides" differenti
|
error.validator.info.provides.notequal=module-info.class in una directory con controllo delle versioni contiene valori "provides" differenti
|
||||||
error.invalid.versioned.module.attribute=Attributo descrittore del modulo {0} non valido.
|
error.invalid.versioned.module.attribute=Attributo descrittore del modulo {0} non valido.
|
||||||
error.missing.provider=Provider di servizi non trovato: {0}
|
error.missing.provider=Provider di servizi non trovato: {0}
|
||||||
error.release.value.notnumber=release {0} non valida
|
error.release.value.notnumber=release {0} non valida
|
||||||
|
@ -42,13 +42,13 @@ error.hash.dep=\u30E2\u30B8\u30E5\u30FC\u30EB{0}\u4F9D\u5B58\u6027\u306E\u30CF\u
|
|||||||
error.module.options.without.info=--module-version\u307E\u305F\u306F--hash-modules\u306E\u3044\u305A\u308C\u304B\u3067module-info.class\u304C\u3042\u308A\u307E\u305B\u3093
|
error.module.options.without.info=--module-version\u307E\u305F\u306F--hash-modules\u306E\u3044\u305A\u308C\u304B\u3067module-info.class\u304C\u3042\u308A\u307E\u305B\u3093
|
||||||
error.unexpected.module-info=\u4E88\u671F\u3057\u306A\u3044\u30E2\u30B8\u30E5\u30FC\u30EB\u30FB\u30C7\u30A3\u30B9\u30AF\u30EA\u30D7\u30BF{0}
|
error.unexpected.module-info=\u4E88\u671F\u3057\u306A\u3044\u30E2\u30B8\u30E5\u30FC\u30EB\u30FB\u30C7\u30A3\u30B9\u30AF\u30EA\u30D7\u30BF{0}
|
||||||
error.module.descriptor.not.found=\u30E2\u30B8\u30E5\u30FC\u30EB\u30FB\u30C7\u30A3\u30B9\u30AF\u30EA\u30D7\u30BF\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093
|
error.module.descriptor.not.found=\u30E2\u30B8\u30E5\u30FC\u30EB\u30FB\u30C7\u30A3\u30B9\u30AF\u30EA\u30D7\u30BF\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093
|
||||||
error.versioned.info.without.root=module-info.class\u304C\u3001\u30EB\u30FC\u30C8\u306Bmodule-info.class\u306E\u306A\u3044\u30D0\u30FC\u30B8\u30E7\u30CB\u30F3\u30B0\u3055\u308C\u305F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306B\u898B\u3064\u304B\u308A\u307E\u3057\u305F
|
error.validator.info.without.root=module-info.class\u304C\u3001\u30EB\u30FC\u30C8\u306Bmodule-info.class\u306E\u306A\u3044\u30D0\u30FC\u30B8\u30E7\u30CB\u30F3\u30B0\u3055\u308C\u305F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306B\u898B\u3064\u304B\u308A\u307E\u3057\u305F
|
||||||
error.versioned.info.name.notequal=\u30D0\u30FC\u30B8\u30E7\u30CB\u30F3\u30B0\u3055\u308C\u305F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306Emodule-info.class\u306B\u6B63\u3057\u304F\u306A\u3044\u540D\u524D\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059
|
error.validator.info.name.notequal=\u30D0\u30FC\u30B8\u30E7\u30CB\u30F3\u30B0\u3055\u308C\u305F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306Emodule-info.class\u306B\u6B63\u3057\u304F\u306A\u3044\u540D\u524D\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059
|
||||||
error.versioned.info.requires.public=\u30D0\u30FC\u30B8\u30E7\u30CB\u30F3\u30B0\u3055\u308C\u305F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306Emodule-info.class\u306B\u8FFD\u52A0\u306E"requires public"\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059
|
error.validator.info.requires.public=\u30D0\u30FC\u30B8\u30E7\u30CB\u30F3\u30B0\u3055\u308C\u305F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306Emodule-info.class\u306B\u8FFD\u52A0\u306E"requires public"\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059
|
||||||
error.versioned.info.requires.added=\u30D0\u30FC\u30B8\u30E7\u30CB\u30F3\u30B0\u3055\u308C\u305F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306Emodule-info.class\u306B\u8FFD\u52A0\u306E"requires"\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059
|
error.validator.info.requires.added=\u30D0\u30FC\u30B8\u30E7\u30CB\u30F3\u30B0\u3055\u308C\u305F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306Emodule-info.class\u306B\u8FFD\u52A0\u306E"requires"\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059
|
||||||
error.versioned.info.requires.dropped=\u30D0\u30FC\u30B8\u30E7\u30CB\u30F3\u30B0\u3055\u308C\u305F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306Emodule-info.class\u306B\u6B20\u843D\u3057\u3066\u3044\u308B"requires"\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059
|
error.validator.info.requires.dropped=\u30D0\u30FC\u30B8\u30E7\u30CB\u30F3\u30B0\u3055\u308C\u305F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306Emodule-info.class\u306B\u6B20\u843D\u3057\u3066\u3044\u308B"requires"\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059
|
||||||
error.versioned.info.exports.notequal=\u30D0\u30FC\u30B8\u30E7\u30CB\u30F3\u30B0\u3055\u308C\u305F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306Emodule-info.class\u306B\u7570\u306A\u308B"exports"\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059
|
error.validator.info.exports.notequal=\u30D0\u30FC\u30B8\u30E7\u30CB\u30F3\u30B0\u3055\u308C\u305F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306Emodule-info.class\u306B\u7570\u306A\u308B"exports"\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059
|
||||||
error.versioned.info.provides.notequal=\u30D0\u30FC\u30B8\u30E7\u30CB\u30F3\u30B0\u3055\u308C\u305F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306Emodule-info.class\u306B\u7570\u306A\u308B"provides"\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059
|
error.validator.info.provides.notequal=\u30D0\u30FC\u30B8\u30E7\u30CB\u30F3\u30B0\u3055\u308C\u305F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306Emodule-info.class\u306B\u7570\u306A\u308B"provides"\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059
|
||||||
error.invalid.versioned.module.attribute=\u30E2\u30B8\u30E5\u30FC\u30EB\u30FB\u30C7\u30A3\u30B9\u30AF\u30EA\u30D7\u30BF\u5C5E\u6027{0}\u304C\u7121\u52B9\u3067\u3059
|
error.invalid.versioned.module.attribute=\u30E2\u30B8\u30E5\u30FC\u30EB\u30FB\u30C7\u30A3\u30B9\u30AF\u30EA\u30D7\u30BF\u5C5E\u6027{0}\u304C\u7121\u52B9\u3067\u3059
|
||||||
error.missing.provider=\u30B5\u30FC\u30D3\u30B9\u30FB\u30D7\u30ED\u30D0\u30A4\u30C0\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: {0}
|
error.missing.provider=\u30B5\u30FC\u30D3\u30B9\u30FB\u30D7\u30ED\u30D0\u30A4\u30C0\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: {0}
|
||||||
error.release.value.notnumber=\u30EA\u30EA\u30FC\u30B9{0}\u306F\u6709\u52B9\u3067\u306F\u3042\u308A\u307E\u305B\u3093
|
error.release.value.notnumber=\u30EA\u30EA\u30FC\u30B9{0}\u306F\u6709\u52B9\u3067\u306F\u3042\u308A\u307E\u305B\u3093
|
||||||
|
@ -42,13 +42,13 @@ error.hash.dep=\uBAA8\uB4C8 {0} \uC885\uC18D\uC131\uC744 \uD574\uC2DC\uD558\uB29
|
|||||||
error.module.options.without.info=module-info.class \uC5C6\uC774 --module-version \uB610\uB294 --hash-modules \uC911 \uD558\uB098
|
error.module.options.without.info=module-info.class \uC5C6\uC774 --module-version \uB610\uB294 --hash-modules \uC911 \uD558\uB098
|
||||||
error.unexpected.module-info=\uC608\uC0C1\uCE58 \uC54A\uC740 \uBAA8\uB4C8 \uAE30\uC220\uC790 {0}
|
error.unexpected.module-info=\uC608\uC0C1\uCE58 \uC54A\uC740 \uBAA8\uB4C8 \uAE30\uC220\uC790 {0}
|
||||||
error.module.descriptor.not.found=\uBAA8\uB4C8 \uAE30\uC220\uC790\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC74C
|
error.module.descriptor.not.found=\uBAA8\uB4C8 \uAE30\uC220\uC790\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC74C
|
||||||
error.versioned.info.without.root=\uB8E8\uD2B8\uC5D0\uC11C module-info.class \uC5C6\uC774 \uBC84\uC804 \uC9C0\uC815\uB41C \uB514\uB809\uD1A0\uB9AC\uC5D0\uC11C module-info.class\uAC00 \uBC1C\uACAC\uB428
|
error.validator.info.without.root=\uB8E8\uD2B8\uC5D0\uC11C module-info.class \uC5C6\uC774 \uBC84\uC804 \uC9C0\uC815\uB41C \uB514\uB809\uD1A0\uB9AC\uC5D0\uC11C module-info.class\uAC00 \uBC1C\uACAC\uB428
|
||||||
error.versioned.info.name.notequal=\uBC84\uC804 \uC9C0\uC815\uB41C \uB514\uB809\uD1A0\uB9AC\uC758 module-info.class\uC5D0 \uC798\uBABB\uB41C \uC774\uB984\uC774 \uD3EC\uD568\uB428
|
error.validator.info.name.notequal=\uBC84\uC804 \uC9C0\uC815\uB41C \uB514\uB809\uD1A0\uB9AC\uC758 module-info.class\uC5D0 \uC798\uBABB\uB41C \uC774\uB984\uC774 \uD3EC\uD568\uB428
|
||||||
error.versioned.info.requires.public=\uBC84\uC804 \uC9C0\uC815\uB41C \uB514\uB809\uD1A0\uB9AC\uC758 module-info.class\uC5D0 \uCD94\uAC00 "requires public" \uD56D\uBAA9\uC774 \uD3EC\uD568\uB428
|
error.validator.info.requires.public=\uBC84\uC804 \uC9C0\uC815\uB41C \uB514\uB809\uD1A0\uB9AC\uC758 module-info.class\uC5D0 \uCD94\uAC00 "requires public" \uD56D\uBAA9\uC774 \uD3EC\uD568\uB428
|
||||||
error.versioned.info.requires.added=\uBC84\uC804 \uC9C0\uC815\uB41C \uB514\uB809\uD1A0\uB9AC\uC758 module-info.class\uC5D0 \uCD94\uAC00 "requires" \uD56D\uBAA9\uC774 \uD3EC\uD568\uB428
|
error.validator.info.requires.added=\uBC84\uC804 \uC9C0\uC815\uB41C \uB514\uB809\uD1A0\uB9AC\uC758 module-info.class\uC5D0 \uCD94\uAC00 "requires" \uD56D\uBAA9\uC774 \uD3EC\uD568\uB428
|
||||||
error.versioned.info.requires.dropped=\uBC84\uC804 \uC9C0\uC815\uB41C \uB514\uB809\uD1A0\uB9AC\uC758 module-info.class\uC5D0 \uB204\uB77D\uB41C "requires" \uD56D\uBAA9\uC774 \uD3EC\uD568\uB428
|
error.validator.info.requires.dropped=\uBC84\uC804 \uC9C0\uC815\uB41C \uB514\uB809\uD1A0\uB9AC\uC758 module-info.class\uC5D0 \uB204\uB77D\uB41C "requires" \uD56D\uBAA9\uC774 \uD3EC\uD568\uB428
|
||||||
error.versioned.info.exports.notequal=\uBC84\uC804 \uC9C0\uC815\uB41C \uB514\uB809\uD1A0\uB9AC\uC758 module-info.class\uC5D0 \uB2E4\uB978 "exports" \uD56D\uBAA9\uC774 \uD3EC\uD568\uB428
|
error.validator.info.exports.notequal=\uBC84\uC804 \uC9C0\uC815\uB41C \uB514\uB809\uD1A0\uB9AC\uC758 module-info.class\uC5D0 \uB2E4\uB978 "exports" \uD56D\uBAA9\uC774 \uD3EC\uD568\uB428
|
||||||
error.versioned.info.provides.notequal=\uBC84\uC804 \uC9C0\uC815\uB41C \uB514\uB809\uD1A0\uB9AC\uC758 module-info.class\uC5D0 \uB2E4\uB978 "provides" \uD56D\uBAA9\uC774 \uD3EC\uD568\uB428
|
error.validator.info.provides.notequal=\uBC84\uC804 \uC9C0\uC815\uB41C \uB514\uB809\uD1A0\uB9AC\uC758 module-info.class\uC5D0 \uB2E4\uB978 "provides" \uD56D\uBAA9\uC774 \uD3EC\uD568\uB428
|
||||||
error.invalid.versioned.module.attribute=\uBD80\uC801\uD569\uD55C \uBAA8\uB4C8 \uAE30\uC220\uC790 \uC18D\uC131 {0}
|
error.invalid.versioned.module.attribute=\uBD80\uC801\uD569\uD55C \uBAA8\uB4C8 \uAE30\uC220\uC790 \uC18D\uC131 {0}
|
||||||
error.missing.provider=\uC11C\uBE44\uC2A4 \uC81C\uACF5\uC790\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC74C: {0}
|
error.missing.provider=\uC11C\uBE44\uC2A4 \uC81C\uACF5\uC790\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC74C: {0}
|
||||||
error.release.value.notnumber=\uB9B4\uB9AC\uC2A4 {0}\uC774(\uAC00) \uBD80\uC801\uD569\uD568
|
error.release.value.notnumber=\uB9B4\uB9AC\uC2A4 {0}\uC774(\uAC00) \uBD80\uC801\uD569\uD568
|
||||||
|
@ -42,13 +42,13 @@ error.hash.dep=M\u00F3dulo de hashing com {0} depend\u00EAncias. N\u00E3o \u00E9
|
|||||||
error.module.options.without.info=Um dentre --module-version ou --hash-modules est\u00E1 sem module-info.class
|
error.module.options.without.info=Um dentre --module-version ou --hash-modules est\u00E1 sem module-info.class
|
||||||
error.unexpected.module-info=Descritor de m\u00F3dulo inesperado {0}
|
error.unexpected.module-info=Descritor de m\u00F3dulo inesperado {0}
|
||||||
error.module.descriptor.not.found=Descritor de m\u00F3dulo n\u00E3o encontrado
|
error.module.descriptor.not.found=Descritor de m\u00F3dulo n\u00E3o encontrado
|
||||||
error.versioned.info.without.root=module-info.class encontrado em um diret\u00F3rio com controle de vers\u00E3o sem module-info.class na raiz
|
error.validator.info.without.root=module-info.class encontrado em um diret\u00F3rio com controle de vers\u00E3o sem module-info.class na raiz
|
||||||
error.versioned.info.name.notequal=module-info.class em um diret\u00F3rio com controle de vers\u00E3o cont\u00E9m nome incorreto
|
error.validator.info.name.notequal=module-info.class em um diret\u00F3rio com controle de vers\u00E3o cont\u00E9m nome incorreto
|
||||||
error.versioned.info.requires.public=module-info.class em um diret\u00F3rio com controle de vers\u00E3o cont\u00E9m "requires public" adicional
|
error.validator.info.requires.public=module-info.class em um diret\u00F3rio com controle de vers\u00E3o cont\u00E9m "requires public" adicional
|
||||||
error.versioned.info.requires.added=module-info.class em um diret\u00F3rio com controle de vers\u00E3o cont\u00E9m "requires" adicional
|
error.validator.info.requires.added=module-info.class em um diret\u00F3rio com controle de vers\u00E3o cont\u00E9m "requires" adicional
|
||||||
error.versioned.info.requires.dropped=module-info.class em um diret\u00F3rio com controle de vers\u00E3o falta "requires"
|
error.validator.info.requires.dropped=module-info.class em um diret\u00F3rio com controle de vers\u00E3o falta "requires"
|
||||||
error.versioned.info.exports.notequal=module-info.class em um diret\u00F3rio com controle de vers\u00E3o cont\u00E9m "exports" diferente
|
error.validator.info.exports.notequal=module-info.class em um diret\u00F3rio com controle de vers\u00E3o cont\u00E9m "exports" diferente
|
||||||
error.versioned.info.provides.notequal=module-info.class em um diret\u00F3rio com controle de vers\u00E3o cont\u00E9m "provides" diferente
|
error.validator.info.provides.notequal=module-info.class em um diret\u00F3rio com controle de vers\u00E3o cont\u00E9m "provides" diferente
|
||||||
error.invalid.versioned.module.attribute=Atributo {0} de descritor de m\u00F3dulo inv\u00E1lido
|
error.invalid.versioned.module.attribute=Atributo {0} de descritor de m\u00F3dulo inv\u00E1lido
|
||||||
error.missing.provider=Prestador de servi\u00E7os n\u00E3o encontrado: {0}
|
error.missing.provider=Prestador de servi\u00E7os n\u00E3o encontrado: {0}
|
||||||
error.release.value.notnumber=release {0} n\u00E3o v\u00E1lida
|
error.release.value.notnumber=release {0} n\u00E3o v\u00E1lida
|
||||||
|
@ -42,13 +42,13 @@ error.hash.dep={0}-beroenden f\u00F6r hashningsmodulen, kan inte hitta modulen {
|
|||||||
error.module.options.without.info=--module-version eller --hash-modules utan module-info.class
|
error.module.options.without.info=--module-version eller --hash-modules utan module-info.class
|
||||||
error.unexpected.module-info=Ov\u00E4ntad moduldeskriptor, {0}
|
error.unexpected.module-info=Ov\u00E4ntad moduldeskriptor, {0}
|
||||||
error.module.descriptor.not.found=Moduldeskriptorn hittades inte
|
error.module.descriptor.not.found=Moduldeskriptorn hittades inte
|
||||||
error.versioned.info.without.root=module-info.class hittades i en versionshanterad katalog utan module-info.class i roten
|
error.validator.info.without.root=module-info.class hittades i en versionshanterad katalog utan module-info.class i roten
|
||||||
error.versioned.info.name.notequal=module-info.class i en versionshanterad katalog inneh\u00E5ller ett felaktigt namn
|
error.validator.info.name.notequal=module-info.class i en versionshanterad katalog inneh\u00E5ller ett felaktigt namn
|
||||||
error.versioned.info.requires.public=module-info.class i en versionshanterad katalog inneh\u00E5ller fler "requires public"
|
error.validator.info.requires.public=module-info.class i en versionshanterad katalog inneh\u00E5ller fler "requires public"
|
||||||
error.versioned.info.requires.added=module-info.class i en versionshanterad katalog inneh\u00E5ller fler "requires"
|
error.validator.info.requires.added=module-info.class i en versionshanterad katalog inneh\u00E5ller fler "requires"
|
||||||
error.versioned.info.requires.dropped=module-info.class i en versionshanterad katalog inneh\u00E5ller saknade "requires"
|
error.validator.info.requires.dropped=module-info.class i en versionshanterad katalog inneh\u00E5ller saknade "requires"
|
||||||
error.versioned.info.exports.notequal=module-info.class i en versionshanterad katalog inneh\u00E5ller olika "exports"
|
error.validator.info.exports.notequal=module-info.class i en versionshanterad katalog inneh\u00E5ller olika "exports"
|
||||||
error.versioned.info.provides.notequal=module-info.class i en versionshanterad katalog inneh\u00E5ller olika "provides"
|
error.validator.info.provides.notequal=module-info.class i en versionshanterad katalog inneh\u00E5ller olika "provides"
|
||||||
error.invalid.versioned.module.attribute=Ogiltigt attribut f\u00F6r moduldeskriptor, {0}
|
error.invalid.versioned.module.attribute=Ogiltigt attribut f\u00F6r moduldeskriptor, {0}
|
||||||
error.missing.provider=Tj\u00E4nsteleverant\u00F6ren hittades inte: {0}
|
error.missing.provider=Tj\u00E4nsteleverant\u00F6ren hittades inte: {0}
|
||||||
error.release.value.notnumber=utg\u00E5va {0} \u00E4r inte giltig
|
error.release.value.notnumber=utg\u00E5va {0} \u00E4r inte giltig
|
||||||
|
@ -42,13 +42,13 @@ error.hash.dep=\u6B63\u5728\u5BF9\u6A21\u5757 {0} \u7684\u88AB\u4F9D\u8D56\u5BF9
|
|||||||
error.module.options.without.info=--module-version \u6216 --hash-modules \u4E4B\u4E00\u6CA1\u6709 module-info.class
|
error.module.options.without.info=--module-version \u6216 --hash-modules \u4E4B\u4E00\u6CA1\u6709 module-info.class
|
||||||
error.unexpected.module-info=\u610F\u5916\u7684\u6A21\u5757\u63CF\u8FF0\u7B26 {0}
|
error.unexpected.module-info=\u610F\u5916\u7684\u6A21\u5757\u63CF\u8FF0\u7B26 {0}
|
||||||
error.module.descriptor.not.found=\u627E\u4E0D\u5230\u6A21\u5757\u63CF\u8FF0\u7B26
|
error.module.descriptor.not.found=\u627E\u4E0D\u5230\u6A21\u5757\u63CF\u8FF0\u7B26
|
||||||
error.versioned.info.without.root=\u5728\u7248\u672C\u5316\u76EE\u5F55\u4E2D\u627E\u5230\u4E86 module-info.class, \u4F46\u6839\u4E2D\u6CA1\u6709 module-info.class
|
error.validator.info.without.root=\u5728\u7248\u672C\u5316\u76EE\u5F55\u4E2D\u627E\u5230\u4E86 module-info.class, \u4F46\u6839\u4E2D\u6CA1\u6709 module-info.class
|
||||||
error.versioned.info.name.notequal=\u7248\u672C\u5316\u76EE\u5F55\u4E2D\u7684 module-info.class \u5305\u542B\u4E0D\u6B63\u786E\u7684\u540D\u79F0
|
error.validator.info.name.notequal=\u7248\u672C\u5316\u76EE\u5F55\u4E2D\u7684 module-info.class \u5305\u542B\u4E0D\u6B63\u786E\u7684\u540D\u79F0
|
||||||
error.versioned.info.requires.public=\u7248\u672C\u5316\u76EE\u5F55\u4E2D\u7684 module-info.class \u5305\u542B\u989D\u5916\u7684 "requires public"
|
error.validator.info.requires.public=\u7248\u672C\u5316\u76EE\u5F55\u4E2D\u7684 module-info.class \u5305\u542B\u989D\u5916\u7684 "requires public"
|
||||||
error.versioned.info.requires.added=\u7248\u672C\u5316\u76EE\u5F55\u4E2D\u7684 module-info.class \u5305\u542B\u989D\u5916\u7684 "requires"
|
error.validator.info.requires.added=\u7248\u672C\u5316\u76EE\u5F55\u4E2D\u7684 module-info.class \u5305\u542B\u989D\u5916\u7684 "requires"
|
||||||
error.versioned.info.requires.dropped=\u7248\u672C\u5316\u76EE\u5F55\u4E2D\u7684 module-info.class \u5305\u542B\u7F3A\u5C11\u7684 "requires"
|
error.validator.info.requires.dropped=\u7248\u672C\u5316\u76EE\u5F55\u4E2D\u7684 module-info.class \u5305\u542B\u7F3A\u5C11\u7684 "requires"
|
||||||
error.versioned.info.exports.notequal=\u7248\u672C\u5316\u76EE\u5F55\u4E2D\u7684 module-info.class \u5305\u542B\u4E0D\u540C\u7684 "exports"
|
error.validator.info.exports.notequal=\u7248\u672C\u5316\u76EE\u5F55\u4E2D\u7684 module-info.class \u5305\u542B\u4E0D\u540C\u7684 "exports"
|
||||||
error.versioned.info.provides.notequal=\u7248\u672C\u5316\u76EE\u5F55\u4E2D\u7684 module-info.class \u5305\u542B\u4E0D\u540C\u7684 "provides"
|
error.validator.info.provides.notequal=\u7248\u672C\u5316\u76EE\u5F55\u4E2D\u7684 module-info.class \u5305\u542B\u4E0D\u540C\u7684 "provides"
|
||||||
error.invalid.versioned.module.attribute=\u65E0\u6548\u7684\u6A21\u5757\u63CF\u8FF0\u7B26\u5C5E\u6027 {0}
|
error.invalid.versioned.module.attribute=\u65E0\u6548\u7684\u6A21\u5757\u63CF\u8FF0\u7B26\u5C5E\u6027 {0}
|
||||||
error.missing.provider=\u672A\u627E\u5230\u670D\u52A1\u63D0\u4F9B\u65B9: {0}
|
error.missing.provider=\u672A\u627E\u5230\u670D\u52A1\u63D0\u4F9B\u65B9: {0}
|
||||||
error.release.value.notnumber=\u53D1\u884C\u7248 {0} \u65E0\u6548
|
error.release.value.notnumber=\u53D1\u884C\u7248 {0} \u65E0\u6548
|
||||||
|
@ -42,13 +42,13 @@ error.hash.dep=\u96DC\u6E4A\u6A21\u7D44 {0} \u76F8\u4F9D\u6027\uFF0C\u5728\u6A21
|
|||||||
error.module.options.without.info=--module-version \u6216 --hash-modules \u5176\u4E2D\u4E00\u500B\u6C92\u6709 module-info.class
|
error.module.options.without.info=--module-version \u6216 --hash-modules \u5176\u4E2D\u4E00\u500B\u6C92\u6709 module-info.class
|
||||||
error.unexpected.module-info=\u672A\u9810\u671F\u7684\u6A21\u7D44\u63CF\u8FF0\u5340 {0}
|
error.unexpected.module-info=\u672A\u9810\u671F\u7684\u6A21\u7D44\u63CF\u8FF0\u5340 {0}
|
||||||
error.module.descriptor.not.found=\u627E\u4E0D\u5230\u6A21\u7D44\u63CF\u8FF0\u5340
|
error.module.descriptor.not.found=\u627E\u4E0D\u5230\u6A21\u7D44\u63CF\u8FF0\u5340
|
||||||
error.versioned.info.without.root=\u5728\u5DF2\u555F\u52D5\u591A\u7248\u672C\u529F\u80FD\u76EE\u9304\u4E2D\u767C\u73FE module-info.class\uFF0C\u4F46\u662F\u6839\u4E2D\u6C92\u6709 module-info.class
|
error.validator.info.without.root=\u5728\u5DF2\u555F\u52D5\u591A\u7248\u672C\u529F\u80FD\u76EE\u9304\u4E2D\u767C\u73FE module-info.class\uFF0C\u4F46\u662F\u6839\u4E2D\u6C92\u6709 module-info.class
|
||||||
error.versioned.info.name.notequal=\u5DF2\u555F\u52D5\u591A\u7248\u672C\u529F\u80FD\u76EE\u9304\u4E2D\u7684 module-info.class \u5305\u542B\u4E0D\u6B63\u78BA\u7684\u540D\u7A31
|
error.validator.info.name.notequal=\u5DF2\u555F\u52D5\u591A\u7248\u672C\u529F\u80FD\u76EE\u9304\u4E2D\u7684 module-info.class \u5305\u542B\u4E0D\u6B63\u78BA\u7684\u540D\u7A31
|
||||||
error.versioned.info.requires.public=\u5DF2\u555F\u52D5\u591A\u7248\u672C\u529F\u80FD\u76EE\u9304\u4E2D\u7684 module-info.class \u5305\u542B\u984D\u5916\u7684 "requires public"
|
error.validator.info.requires.public=\u5DF2\u555F\u52D5\u591A\u7248\u672C\u529F\u80FD\u76EE\u9304\u4E2D\u7684 module-info.class \u5305\u542B\u984D\u5916\u7684 "requires public"
|
||||||
error.versioned.info.requires.added=\u5DF2\u555F\u52D5\u591A\u7248\u672C\u529F\u80FD\u76EE\u9304\u4E2D\u7684 module-info.class \u5305\u542B\u984D\u5916\u7684 "requires"
|
error.validator.info.requires.added=\u5DF2\u555F\u52D5\u591A\u7248\u672C\u529F\u80FD\u76EE\u9304\u4E2D\u7684 module-info.class \u5305\u542B\u984D\u5916\u7684 "requires"
|
||||||
error.versioned.info.requires.dropped=\u5DF2\u555F\u52D5\u591A\u7248\u672C\u529F\u80FD\u76EE\u9304\u4E2D\u7684 module-info.class \u5305\u542B\u907A\u6F0F\u7684 "requires"
|
error.validator.info.requires.dropped=\u5DF2\u555F\u52D5\u591A\u7248\u672C\u529F\u80FD\u76EE\u9304\u4E2D\u7684 module-info.class \u5305\u542B\u907A\u6F0F\u7684 "requires"
|
||||||
error.versioned.info.exports.notequal=\u5DF2\u555F\u52D5\u591A\u7248\u672C\u529F\u80FD\u76EE\u9304\u4E2D\u7684 module-info.class \u5305\u542B\u4E0D\u540C\u7684 "exports"
|
error.validator.info.exports.notequal=\u5DF2\u555F\u52D5\u591A\u7248\u672C\u529F\u80FD\u76EE\u9304\u4E2D\u7684 module-info.class \u5305\u542B\u4E0D\u540C\u7684 "exports"
|
||||||
error.versioned.info.provides.notequal=\u5DF2\u555F\u52D5\u591A\u7248\u672C\u529F\u80FD\u76EE\u9304\u4E2D\u7684 module-info.class \u5305\u542B\u4E0D\u540C\u7684 "provides"
|
error.validator.info.provides.notequal=\u5DF2\u555F\u52D5\u591A\u7248\u672C\u529F\u80FD\u76EE\u9304\u4E2D\u7684 module-info.class \u5305\u542B\u4E0D\u540C\u7684 "provides"
|
||||||
error.invalid.versioned.module.attribute=\u6A21\u7D44\u63CF\u8FF0\u5340\u5C6C\u6027 {0} \u7121\u6548
|
error.invalid.versioned.module.attribute=\u6A21\u7D44\u63CF\u8FF0\u5340\u5C6C\u6027 {0} \u7121\u6548
|
||||||
error.missing.provider=\u627E\u4E0D\u5230\u670D\u52D9\u63D0\u4F9B\u8005: {0}
|
error.missing.provider=\u627E\u4E0D\u5230\u670D\u52D9\u63D0\u4F9B\u8005: {0}
|
||||||
error.release.value.notnumber=\u7248\u672C {0} \u7121\u6548
|
error.release.value.notnumber=\u7248\u672C {0} \u7121\u6548
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -23,36 +23,43 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* @test
|
* @test
|
||||||
* @bug 8146486
|
* @bug 8146486 8172432
|
||||||
* @summary Fail to create a MR modular JAR with a versioned entry in
|
* @summary Fail to create a MR modular JAR with a versioned entry in
|
||||||
* base-versioned empty package
|
* base-versioned empty package
|
||||||
* @modules jdk.compiler
|
* @modules java.base/jdk.internal.module
|
||||||
|
* jdk.compiler
|
||||||
* jdk.jartool
|
* jdk.jartool
|
||||||
* @library /lib/testlibrary
|
* @library /lib/testlibrary
|
||||||
* @build jdk.testlibrary.FileUtils
|
* @build jdk.testlibrary.FileUtils
|
||||||
* @run testng ConcealedPackage
|
* @run testng Basic
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import org.testng.Assert;
|
import org.testng.Assert;
|
||||||
import org.testng.annotations.AfterClass;
|
import org.testng.annotations.AfterClass;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
import java.io.UncheckedIOException;
|
import java.io.UncheckedIOException;
|
||||||
|
import java.lang.module.ModuleDescriptor;
|
||||||
|
import java.lang.module.ModuleDescriptor.Version;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.spi.ToolProvider;
|
import java.util.spi.ToolProvider;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
import java.util.zip.ZipFile;
|
||||||
|
|
||||||
|
import jdk.internal.module.ModuleInfoExtender;
|
||||||
import jdk.testlibrary.FileUtils;
|
import jdk.testlibrary.FileUtils;
|
||||||
|
|
||||||
public class ConcealedPackage {
|
public class Basic {
|
||||||
private static final ToolProvider JAR_TOOL = ToolProvider.findFirst("jar")
|
private static final ToolProvider JAR_TOOL = ToolProvider.findFirst("jar")
|
||||||
.orElseThrow(() -> new RuntimeException("jar tool not found"));
|
.orElseThrow(() -> new RuntimeException("jar tool not found"));
|
||||||
private static final ToolProvider JAVAC_TOOL = ToolProvider.findFirst("javac")
|
private static final ToolProvider JAVAC_TOOL = ToolProvider.findFirst("javac")
|
||||||
@ -65,7 +72,7 @@ public class ConcealedPackage {
|
|||||||
private final ByteArrayOutputStream errbytes = new ByteArrayOutputStream();
|
private final ByteArrayOutputStream errbytes = new ByteArrayOutputStream();
|
||||||
private final PrintStream err = new PrintStream(errbytes, true);
|
private final PrintStream err = new PrintStream(errbytes, true);
|
||||||
|
|
||||||
public ConcealedPackage() throws IOException {
|
public Basic() throws IOException {
|
||||||
testsrc = Paths.get(System.getProperty("test.src"));
|
testsrc = Paths.get(System.getProperty("test.src"));
|
||||||
userdir = Paths.get(System.getProperty("user.dir", "."));
|
userdir = Paths.get(System.getProperty("user.dir", "."));
|
||||||
|
|
||||||
@ -205,6 +212,7 @@ public class ConcealedPackage {
|
|||||||
"META-INF/versions/9/module-info.class",
|
"META-INF/versions/9/module-info.class",
|
||||||
"p/",
|
"p/",
|
||||||
"p/Hi.class",
|
"p/Hi.class",
|
||||||
|
"META-INF/versions/9/",
|
||||||
"META-INF/versions/9/p/",
|
"META-INF/versions/9/p/",
|
||||||
"META-INF/versions/9/p/Hi.class",
|
"META-INF/versions/9/p/Hi.class",
|
||||||
"META-INF/versions/9/p/internal/",
|
"META-INF/versions/9/p/internal/",
|
||||||
@ -247,6 +255,7 @@ public class ConcealedPackage {
|
|||||||
"META-INF/MANIFEST.MF",
|
"META-INF/MANIFEST.MF",
|
||||||
"p/",
|
"p/",
|
||||||
"p/Hi.class",
|
"p/Hi.class",
|
||||||
|
"META-INF/versions/9/",
|
||||||
"META-INF/versions/9/p/",
|
"META-INF/versions/9/p/",
|
||||||
"META-INF/versions/9/p/Hi.class",
|
"META-INF/versions/9/p/Hi.class",
|
||||||
"META-INF/versions/9/p/internal/",
|
"META-INF/versions/9/p/internal/",
|
||||||
@ -277,10 +286,12 @@ public class ConcealedPackage {
|
|||||||
"META-INF/MANIFEST.MF",
|
"META-INF/MANIFEST.MF",
|
||||||
"p/",
|
"p/",
|
||||||
"p/Hi.class",
|
"p/Hi.class",
|
||||||
|
"META-INF/versions/9/",
|
||||||
"META-INF/versions/9/p/",
|
"META-INF/versions/9/p/",
|
||||||
"META-INF/versions/9/p/Hi.class",
|
"META-INF/versions/9/p/Hi.class",
|
||||||
"META-INF/versions/9/p/internal/",
|
"META-INF/versions/9/p/internal/",
|
||||||
"META-INF/versions/9/p/internal/Bar.class",
|
"META-INF/versions/9/p/internal/Bar.class",
|
||||||
|
"META-INF/versions/10/",
|
||||||
"META-INF/versions/10/p/",
|
"META-INF/versions/10/p/",
|
||||||
"META-INF/versions/10/p/internal/",
|
"META-INF/versions/10/p/internal/",
|
||||||
"META-INF/versions/10/p/internal/bar/",
|
"META-INF/versions/10/p/internal/bar/",
|
||||||
@ -302,6 +313,116 @@ public class ConcealedPackage {
|
|||||||
Assert.assertEquals(actual, expected);
|
Assert.assertEquals(actual, expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// root and versioned module-info entries have different main-class, version
|
||||||
|
// attributes
|
||||||
|
@Test
|
||||||
|
public void test6() throws IOException {
|
||||||
|
// create a directory for this tests special files
|
||||||
|
Files.createDirectory(Paths.get("test6"));
|
||||||
|
Files.createDirectory(Paths.get("test6-v9"));
|
||||||
|
|
||||||
|
// compile the classes directory
|
||||||
|
Path src = testsrc.resolve("src").resolve("classes");
|
||||||
|
Path dst = Paths.get("test6");
|
||||||
|
javac(src, dst);
|
||||||
|
|
||||||
|
byte[] mdBytes = Files.readAllBytes(Paths.get("module-info.class"));
|
||||||
|
|
||||||
|
ModuleInfoExtender mie = ModuleInfoExtender.newExtender(
|
||||||
|
new ByteArrayInputStream(mdBytes));
|
||||||
|
|
||||||
|
mie.mainClass("foo.main");
|
||||||
|
mie.version(Version.parse("1.0"));
|
||||||
|
|
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
mie.write(baos);
|
||||||
|
Files.write(Paths.get("test6", "module-info.class"), baos.toByteArray());
|
||||||
|
Files.write(Paths.get("test6-v9", "module-info.class"), baos.toByteArray());
|
||||||
|
|
||||||
|
int rc = jar("--create --file mmr.jar -C test6 . --release 9 -C test6-v9 .");
|
||||||
|
Assert.assertEquals(rc, 0);
|
||||||
|
|
||||||
|
|
||||||
|
// different main-class
|
||||||
|
mie = ModuleInfoExtender.newExtender(new ByteArrayInputStream(mdBytes));
|
||||||
|
mie.mainClass("foo.main2");
|
||||||
|
mie.version(Version.parse("1.0"));
|
||||||
|
baos.reset();
|
||||||
|
mie.write(baos);
|
||||||
|
Files.write(Paths.get("test6-v9", "module-info.class"), baos.toByteArray());
|
||||||
|
|
||||||
|
rc = jar("--create --file mmr.jar -C test6 . --release 9 -C test6-v9 .");
|
||||||
|
Assert.assertEquals(rc, 1);
|
||||||
|
|
||||||
|
Assert.assertTrue(Message.CONTAINS_DIFFERENT_MAINCLASS.match(
|
||||||
|
new String(errbytes.toByteArray()),
|
||||||
|
"META-INF/versions/9/module-info.class"));
|
||||||
|
|
||||||
|
// different version
|
||||||
|
mie = ModuleInfoExtender.newExtender(new ByteArrayInputStream(mdBytes));
|
||||||
|
mie.mainClass("foo.main");
|
||||||
|
mie.version(Version.parse("2.0"));
|
||||||
|
baos.reset();
|
||||||
|
mie.write(baos);
|
||||||
|
Files.write(Paths.get("test6-v9", "module-info.class"), baos.toByteArray());
|
||||||
|
|
||||||
|
rc = jar("--create --file mmr.jar -C test6 . --release 9 -C test6-v9 .");
|
||||||
|
Assert.assertEquals(rc, 1);
|
||||||
|
|
||||||
|
Assert.assertTrue(Message.CONTAINS_DIFFERENT_VERSION.match(
|
||||||
|
new String(errbytes.toByteArray()),
|
||||||
|
"META-INF/versions/9/module-info.class"));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// versioned mmr without root module-info.class
|
||||||
|
@Test
|
||||||
|
public void test7() throws IOException {
|
||||||
|
// create a directory for this tests special files
|
||||||
|
Files.createDirectory(Paths.get("test7"));
|
||||||
|
Files.createDirectory(Paths.get("test7-v9"));
|
||||||
|
Files.createDirectory(Paths.get("test7-v10"));
|
||||||
|
|
||||||
|
// compile the classes directory
|
||||||
|
Path src = testsrc.resolve("src").resolve("classes");
|
||||||
|
Path dst = Paths.get("test7");
|
||||||
|
javac(src, dst);
|
||||||
|
|
||||||
|
// move module-info.class to v9 later use
|
||||||
|
Files.copy(Paths.get("module-info.class"),
|
||||||
|
Paths.get("test7-v9", "module-info.class"));
|
||||||
|
|
||||||
|
Files.copy(Paths.get("test7-v9", "module-info.class"),
|
||||||
|
Paths.get("test7-v10", "module-info.class"));
|
||||||
|
|
||||||
|
int rc = jar("--create --file mmr.jar --main-class=foo.main -C test7 . --release 9 -C test7-v9 . --release 10 -C test7-v10 .");
|
||||||
|
|
||||||
|
System.out.println("-----------------------");
|
||||||
|
System.out.println( new String(errbytes.toByteArray()));
|
||||||
|
|
||||||
|
|
||||||
|
Assert.assertEquals(rc, 0);
|
||||||
|
|
||||||
|
|
||||||
|
jar("-tf mmr.jar");
|
||||||
|
|
||||||
|
System.out.println("-----------------------");
|
||||||
|
System.out.println( new String(outbytes.toByteArray()));
|
||||||
|
|
||||||
|
Optional<String> exp = Optional.of("foo.main");
|
||||||
|
try (ZipFile zf = new ZipFile("mmr.jar")) {
|
||||||
|
Assert.assertTrue(zf.getEntry("module-info.class") == null);
|
||||||
|
|
||||||
|
ModuleDescriptor md = ModuleDescriptor.read(
|
||||||
|
zf.getInputStream(zf.getEntry("META-INF/versions/9/module-info.class")));
|
||||||
|
Assert.assertEquals(md.mainClass(), exp);
|
||||||
|
|
||||||
|
md = ModuleDescriptor.read(
|
||||||
|
zf.getInputStream(zf.getEntry("META-INF/versions/10/module-info.class")));
|
||||||
|
Assert.assertEquals(md.mainClass(), exp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static Set<String> lines(ByteArrayOutputStream baos) {
|
private static Set<String> lines(ByteArrayOutputStream baos) {
|
||||||
String s = new String(baos.toByteArray());
|
String s = new String(baos.toByteArray());
|
||||||
return Arrays.stream(s.split("\\R"))
|
return Arrays.stream(s.split("\\R"))
|
||||||
@ -311,6 +432,12 @@ public class ConcealedPackage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static enum Message {
|
static enum Message {
|
||||||
|
CONTAINS_DIFFERENT_MAINCLASS(
|
||||||
|
": module-info.class in a versioned directory contains different \"main-class\""
|
||||||
|
),
|
||||||
|
CONTAINS_DIFFERENT_VERSION(
|
||||||
|
": module-info.class in a versioned directory contains different \"version\""
|
||||||
|
),
|
||||||
NOT_FOUND_IN_BASE_ENTRY(
|
NOT_FOUND_IN_BASE_ENTRY(
|
||||||
", contains a new public class not found in base entries"
|
", contains a new public class not found in base entries"
|
||||||
),
|
),
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -46,7 +46,7 @@ import static java.lang.System.out;
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* @test
|
* @test
|
||||||
* @bug 8167328
|
* @bug 8167328 8171830
|
||||||
* @library /lib/testlibrary
|
* @library /lib/testlibrary
|
||||||
* @modules jdk.compiler
|
* @modules jdk.compiler
|
||||||
* jdk.jartool
|
* jdk.jartool
|
||||||
@ -241,6 +241,11 @@ public class Basic {
|
|||||||
|
|
||||||
java(mp, FOO.moduleName + "/" + FOO.mainClass)
|
java(mp, FOO.moduleName + "/" + FOO.mainClass)
|
||||||
.assertSuccess()
|
.assertSuccess()
|
||||||
|
.resultChecker(r -> {
|
||||||
|
System.out.println("===================================");
|
||||||
|
System.out.println(r.output);
|
||||||
|
System.out.println("===================================");
|
||||||
|
})
|
||||||
.resultChecker(r -> assertModuleData(r, FOO));
|
.resultChecker(r -> assertModuleData(r, FOO));
|
||||||
try (InputStream fis = Files.newInputStream(modularJar);
|
try (InputStream fis = Files.newInputStream(modularJar);
|
||||||
JarInputStream jis = new JarInputStream(fis)) {
|
JarInputStream jis = new JarInputStream(fis)) {
|
||||||
@ -417,6 +422,7 @@ public class Basic {
|
|||||||
jar("--update",
|
jar("--update",
|
||||||
"--file=" + modularJar.toString(),
|
"--file=" + modularJar.toString(),
|
||||||
"--main-class=" + FOO.mainClass,
|
"--main-class=" + FOO.mainClass,
|
||||||
|
"--module-version=" + FOO.version,
|
||||||
"-m", mrjarDir.resolve("META-INF/MANIFEST.MF").toRealPath().toString(),
|
"-m", mrjarDir.resolve("META-INF/MANIFEST.MF").toRealPath().toString(),
|
||||||
"-C", mrjarDir.toString(), "META-INF/versions/9/module-info.class")
|
"-C", mrjarDir.toString(), "META-INF/versions/9/module-info.class")
|
||||||
.assertSuccess();
|
.assertSuccess();
|
||||||
@ -733,6 +739,25 @@ public class Basic {
|
|||||||
.assertSuccess();
|
.assertSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void exportCreateWithMissingPkg() throws IOException {
|
||||||
|
|
||||||
|
Path foobar = TEST_SRC.resolve("src").resolve("foobar");
|
||||||
|
Path dst = Files.createDirectories(MODULE_CLASSES.resolve("foobar"));
|
||||||
|
javac(dst, null, sourceList(foobar));
|
||||||
|
|
||||||
|
Path mp = Paths.get("exportWithMissingPkg");
|
||||||
|
createTestDir(mp);
|
||||||
|
Path modClasses = dst;
|
||||||
|
Path modularJar = mp.resolve("foofoo.jar");
|
||||||
|
|
||||||
|
jar("--create",
|
||||||
|
"--file=" + modularJar.toString(),
|
||||||
|
"-C", modClasses.toString(), "module-info.class",
|
||||||
|
"-C", modClasses.toString(), "jdk/test/foo/Foo.class")
|
||||||
|
.assertFailure();
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void printModuleDescriptorFoo() throws IOException {
|
public void printModuleDescriptorFoo() throws IOException {
|
||||||
Path mp = Paths.get("printModuleDescriptorFoo");
|
Path mp = Paths.get("printModuleDescriptorFoo");
|
||||||
|
28
jdk/test/tools/jar/modularJar/src/foobar/Bar.java
Normal file
28
jdk/test/tools/jar/modularJar/src/foobar/Bar.java
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package jdk.test.bar;
|
||||||
|
|
||||||
|
public class Bar {
|
||||||
|
public static void main(String[] args) {}
|
||||||
|
}
|
28
jdk/test/tools/jar/modularJar/src/foobar/Foo.java
Normal file
28
jdk/test/tools/jar/modularJar/src/foobar/Foo.java
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package jdk.test.foo;
|
||||||
|
|
||||||
|
public class Foo {
|
||||||
|
public static void main(String[] args) {}
|
||||||
|
}
|
29
jdk/test/tools/jar/modularJar/src/foobar/module-info.java
Normal file
29
jdk/test/tools/jar/modularJar/src/foobar/module-info.java
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
module foo {
|
||||||
|
exports jdk.test.foo;
|
||||||
|
exports jdk.test.bar;
|
||||||
|
opens jdk.test.foo;
|
||||||
|
opens jdk.test.bar;
|
||||||
|
}
|
@ -62,15 +62,20 @@ public class Basic1 {
|
|||||||
Path source = Paths.get(src, "data", test, "base", "version");
|
Path source = Paths.get(src, "data", test, "base", "version");
|
||||||
javac(classes, source.resolve("Main.java"), source.resolve("Version.java"));
|
javac(classes, source.resolve("Main.java"), source.resolve("Version.java"));
|
||||||
|
|
||||||
Path v9 = Paths.get("v9").resolve("META-INF").resolve("versions").resolve("9");
|
Path v9 = Paths.get("v9");
|
||||||
Files.createDirectories(v9);
|
Files.createDirectories(v9);
|
||||||
source = Paths.get(src, "data", test, "v9", "version");
|
source = Paths.get(src, "data", test, "v9", "version");
|
||||||
javac(v9, source.resolve("Version.java"));
|
javac(v9, source.resolve("Version.java"));
|
||||||
|
|
||||||
Path v10 = Paths.get("v10").resolve("META-INF").resolve("versions").resolve("10");
|
Path v10 = Paths.get("v10");
|
||||||
Files.createDirectories(v10);
|
Files.createDirectories(v10);
|
||||||
source = Paths.get(src, "data", test, "v10", "version");
|
source = Paths.get(src, "data", test, "v10", "version");
|
||||||
javac(v10, source.resolve("Version.java"));
|
javac(v10, source.resolve("Version.java"));
|
||||||
|
|
||||||
|
Path v10_1 = Paths.get("v10_1").resolve("META-INF").resolve("versions").resolve("v10");
|
||||||
|
Files.createDirectories(v10_1);
|
||||||
|
source = Paths.get(src, "data", test, "v10", "version");
|
||||||
|
javac(v10_1, source.resolve("Version.java"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -95,28 +100,30 @@ public class Basic1 {
|
|||||||
new String[] {"classes", "base", "version", "Version.class"},
|
new String[] {"classes", "base", "version", "Version.class"},
|
||||||
|
|
||||||
"META-INF/versions/9/version/Version.class",
|
"META-INF/versions/9/version/Version.class",
|
||||||
new String[] {"v9", "META-INF", "versions", "9", "version", "Version.class"},
|
new String[] {"v9", "version", "Version.class"},
|
||||||
|
|
||||||
"META-INF/versions/10/version/Version.class",
|
"META-INF/versions/10/version/Version.class",
|
||||||
new String[] {"v10", "META-INF", "versions", "10", "version", "Version.class"}
|
new String[] {"v10", "version", "Version.class"}
|
||||||
);
|
);
|
||||||
|
|
||||||
compare(jarfile, names);
|
compare(jarfile, names);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFail() throws IOException {
|
public void testFail() throws IOException {
|
||||||
String jarfile = "test.jar";
|
String jarfile = "test.jar";
|
||||||
Path classes = Paths.get("classes");
|
Path classes = Paths.get("classes");
|
||||||
Path v9 = Paths.get("v9");
|
Path v10 = Paths.get("v10_1");
|
||||||
Path v10 = Paths.get("v10");
|
|
||||||
|
|
||||||
jar("cf", jarfile, "-C", classes.resolve("base").toString(), ".",
|
jar("cf", jarfile, "-C", classes.resolve("base").toString(), ".",
|
||||||
"--release", "9", "-C", v10.toString(), ".")
|
"--release", "10", "-C", v10.toString(), ".")
|
||||||
.assertFailure()
|
.assertFailure()
|
||||||
.outputContains("unexpected versioned entry META-INF/versions/");
|
.outputContains("unexpected versioned entry META-INF/versions/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private void checkMultiRelease(String jarFile, boolean expected) throws IOException {
|
private void checkMultiRelease(String jarFile, boolean expected) throws IOException {
|
||||||
try (JarFile jf = new JarFile(new File(jarFile), true, ZipFile.OPEN_READ,
|
try (JarFile jf = new JarFile(new File(jarFile), true, ZipFile.OPEN_READ,
|
||||||
JarFile.runtimeVersion())) {
|
JarFile.runtimeVersion())) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user