< prev index next >
src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java
Print this page
@@ -98,14 +98,15 @@
import jdk.internal.joptsimple.OptionParser;
import jdk.internal.joptsimple.OptionSet;
import jdk.internal.joptsimple.OptionSpec;
import jdk.internal.joptsimple.ValueConverter;
import jdk.internal.loader.ResourceHelper;
-import jdk.internal.misc.JavaLangModuleAccess;
-import jdk.internal.misc.SharedSecrets;
import jdk.internal.module.ModuleHashes;
+import jdk.internal.module.ModuleInfo;
import jdk.internal.module.ModuleInfoExtender;
+import jdk.internal.module.ModulePath;
+import jdk.internal.module.ModuleResolution;
import jdk.tools.jlink.internal.Utils;
import static java.util.stream.Collectors.joining;
/**
@@ -174,10 +175,11 @@
String mainClass;
String osName;
String osArch;
String osVersion;
Pattern modulesToHash;
+ ModuleResolution moduleResolution;
boolean dryrun;
List<PathMatcher> excludes;
}
public int run(String[] args) {
@@ -253,12 +255,12 @@
}
private boolean describe() throws IOException {
try (JmodFile jf = new JmodFile(options.jmodFile)) {
try (InputStream in = jf.getInputStream(Section.CLASSES, MODULE_INFO)) {
- ModuleDescriptor md = ModuleDescriptor.read(in);
- printModuleDescriptor(md);
+ ModuleInfo.Attributes attrs = ModuleInfo.read(in, null);
+ printModuleDescriptor(attrs.descriptor(), attrs.recordedHashes());
return true;
} catch (IOException e) {
throw new CommandException("err.module.descriptor.not.found");
}
}
@@ -268,13 +270,11 @@
if (c.isEmpty()) { return ""; }
return c.stream().map(e -> e.toString().toLowerCase(Locale.ROOT))
.collect(joining(" "));
}
- private static final JavaLangModuleAccess JLMA = SharedSecrets.getJavaLangModuleAccess();
-
- private void printModuleDescriptor(ModuleDescriptor md)
+ private void printModuleDescriptor(ModuleDescriptor md, ModuleHashes hashes)
throws IOException
{
StringBuilder sb = new StringBuilder();
sb.append("\n").append(md.toNameAndVersion());
@@ -316,19 +316,28 @@
md.osArch().ifPresent(v -> sb.append("\n operating-system-architecture " + v));
md.osVersion().ifPresent(v -> sb.append("\n operating-system-version " + v));
- JLMA.hashes(md).ifPresent(
- hashes -> hashes.names().stream().sorted().forEach(
+ if (hashes != null) {
+ hashes.names().stream().sorted().forEach(
mod -> sb.append("\n hashes ").append(mod).append(" ")
.append(hashes.algorithm()).append(" ")
- .append(hashes.hashFor(mod))));
+ .append(toHex(hashes.hashFor(mod))));
+ }
out.println(sb.toString());
}
+ private String toHex(byte[] ba) {
+ StringBuilder sb = new StringBuilder(ba.length);
+ for (byte b: ba) {
+ sb.append(String.format("%02x", b & 0xff));
+ }
+ return sb.toString();
+ }
+
private boolean create() throws IOException {
JmodFileWriter jmod = new JmodFileWriter();
// create jmod with temporary name to avoid it being examined
// when scanning the module path
@@ -365,10 +374,11 @@
final String osName = options.osName;
final String osArch = options.osArch;
final String osVersion = options.osVersion;
final List<PathMatcher> excludes = options.excludes;
final Hasher hasher = hasher();
+ final ModuleResolution moduleResolution = options.moduleResolution;
JmodFileWriter() { }
/**
* Writes the jmod to the given output stream.
@@ -473,10 +483,14 @@
} else {
warning("warn.no.module.hashes", descriptor.name());
}
}
+ if (moduleResolution != null && moduleResolution.value() != 0) {
+ extender.moduleResolution(moduleResolution);
+ }
+
// write the (possibly extended or modified) module-info.class
out.writeEntry(extender.toByteArray(), Section.CLASSES, MODULE_INFO);
}
}
@@ -501,16 +515,16 @@
try (InputStream in = miSupplier.get()) {
descriptor = ModuleDescriptor.read(in);
}
URI uri = options.jmodFile.toUri();
- ModuleReference mref = new ModuleReference(descriptor, uri, new Supplier<>() {
+ ModuleReference mref = new ModuleReference(descriptor, uri) {
@Override
- public ModuleReader get() {
+ public ModuleReader open() {
throw new UnsupportedOperationException();
}
- });
+ };
// compose a module finder with the module path and also
// a module finder that can find the jmod file being created
ModuleFinder finder = ModuleFinder.compose(options.moduleFinder,
new ModuleFinder() {
@@ -1078,10 +1092,32 @@
@Override public Class<Version> valueType() { return Version.class; }
@Override public String valuePattern() { return "module-version"; }
}
+ static class WarnIfResolvedReasonConverter
+ implements ValueConverter<ModuleResolution>
+ {
+ @Override
+ public ModuleResolution convert(String value) {
+ if (value.equals("deprecated"))
+ return (new ModuleResolution(0)).withDeprecated();
+ else if (value.equals("deprecated-for-removal"))
+ return (new ModuleResolution(0)).withDeprecatedForRemoval();
+ else if (value.equals("incubating"))
+ return (new ModuleResolution(0)).withIncubating();
+ else
+ throw new CommandException("err.bad.WarnIfResolvedReason", value);
+ }
+
+ @Override public Class<ModuleResolution> valueType() {
+ return ModuleResolution.class;
+ }
+
+ @Override public String valuePattern() { return "reason"; }
+ }
+
static class PatternConverter implements ValueConverter<Pattern> {
@Override
public Pattern convert(String value) {
try {
if (value.startsWith("regex:")) {
@@ -1127,10 +1163,15 @@
@Override
public String format(Map<String, ? extends OptionDescriptor> options) {
Map<String, OptionDescriptor> all = new HashMap<>();
all.putAll(options);
+
+ // hidden options
+ all.remove("do-not-resolve-by-default");
+ all.remove("warn-if-resolved");
+
all.put(CMD_FILENAME, new OptionDescriptor() {
@Override
public Collection<String> options() {
List<String> ret = new ArrayList<>();
ret.add(CMD_FILENAME);
@@ -1268,10 +1309,18 @@
OptionSpec<String> osVersion
= parser.accepts("os-version", getMessage("main.opt.os-version"))
.withRequiredArg()
.describedAs(getMessage("main.opt.os-version.arg"));
+ OptionSpec<Void> doNotResolveByDefault
+ = parser.accepts("do-not-resolve-by-default");
+
+ OptionSpec<ModuleResolution> warnIfResolved
+ = parser.accepts("warn-if-resolved")
+ .withRequiredArg()
+ .withValuesConvertedBy(new WarnIfResolvedReasonConverter());
+
OptionSpec<Void> version
= parser.accepts("version", getMessage("main.opt.version"));
NonOptionArgumentSpec<String> nonOptions
= parser.nonOptions();
@@ -1313,11 +1362,11 @@
options.headerFiles = opts.valuesOf(headerFiles);
if (opts.has(manPages))
options.manPages = opts.valuesOf(manPages);
if (opts.has(modulePath)) {
Path[] dirs = opts.valuesOf(modulePath).toArray(new Path[0]);
- options.moduleFinder = JLMA.newModulePath(Runtime.version(), true, dirs);
+ options.moduleFinder = new ModulePath(Runtime.version(), true, dirs);
}
if (opts.has(moduleVersion))
options.moduleVersion = opts.valueOf(moduleVersion);
if (opts.has(mainClass))
options.mainClass = opts.valueOf(mainClass);
@@ -1325,10 +1374,17 @@
options.osName = opts.valueOf(osName);
if (opts.has(osArch))
options.osArch = opts.valueOf(osArch);
if (opts.has(osVersion))
options.osVersion = opts.valueOf(osVersion);
+ if (opts.has(warnIfResolved))
+ options.moduleResolution = opts.valueOf(warnIfResolved);
+ if (opts.has(doNotResolveByDefault)) {
+ if (options.moduleResolution == null)
+ options.moduleResolution = new ModuleResolution(0);
+ options.moduleResolution = options.moduleResolution.withDoNotResolveByDefault();
+ }
if (opts.has(hashModules)) {
options.modulesToHash = opts.valueOf(hashModules);
// if storing hashes then the module path is required
if (options.moduleFinder == null)
throw new CommandException("err.modulepath.must.be.specified")
< prev index next >