欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

jboss7 加载module过程

发布时间:2025/4/5 编程问答 32 豆豆
生活随笔 收集整理的这篇文章主要介绍了 jboss7 加载module过程 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

1. 调试类:

org.jboss.as.server.Main的main方法

断点:

Module.registerURLStreamHandlerFactoryModule(Module.getBootModuleLoader().loadModule(ModuleIdentifier.create("org.jboss.vfs")));

2.程序过程如下:

   2.1 初始化模块加载器(Module.getBootModuleLoader()

  org.jboss.modules.LocalModuleLoader的构造方法:

/*** Construct a new instance, using the {@code module.path} system property or the {@code JAVA_MODULEPATH} environment variable* to get the list of module repository roots.*/public LocalModuleLoader() {final String modulePath = System.getProperty("module.path", System.getenv("JAVA_MODULEPATH"));if (modulePath == null) {//noinspection ZeroLengthArrayAllocationrepoRoots = new File[0];} else {repoRoots = getFiles(modulePath, 0, 0);}pathFilter = PathFilters.acceptAll();}

在此时设置module.path路径的值为:/jboss-home/modules,我自己的路径为:D:\source\jboss-as-7.1.1.Final\modules

2. 2 加载模块:(loadModule(ModuleIdentifier.create("org.jboss.vfs")

/*** Load a module based on an identifier. This method delegates to {@link #preloadModule(ModuleIdentifier)} and then* links the returned module if necessary.** @param identifier The module identifier* @return The loaded Module* @throws ModuleLoadException if the Module can not be loaded*/public final Module loadModule(ModuleIdentifier identifier) throws ModuleLoadException {final Module module = preloadModule(identifier);if (module == null) {throw new ModuleNotFoundException(identifier.toString());}module.relinkIfNecessary();return module;}

   2.2.1 预加载模块

    

/*** Preload a module based on an identifier. By default, no delegation is done and this method simply invokes* {@link #loadModuleLocal(ModuleIdentifier)}. A delegating module loader may delegate to the appropriate module* loader based on loader-specific criteria (via the {@link #preloadModule(ModuleIdentifier, ModuleLoader)} method).** @param identifier the module identifier* @return the load result, or {@code null} if the module is not found* @throws ModuleLoadException if an error occurs*/protected Module preloadModule(ModuleIdentifier identifier) throws ModuleLoadException {return loadModuleLocal(identifier);}

   2.2.2 加载本地模块

/*** Try to load a module from this module loader. Returns {@code null} if the module is not found. The returned* module may not yet be resolved. The returned module may have a different name than the given identifier if* the identifier is an alias for another module.** @param identifier the module identifier* @return the module* @throws ModuleLoadException if an error occurs while loading the module*/protected final Module loadModuleLocal(ModuleIdentifier identifier) throws ModuleLoadException {FutureModule futureModule = moduleMap.get(identifier);if (futureModule != null) {return futureModule.getModule();}FutureModule newFuture = new FutureModule(identifier);futureModule = moduleMap.putIfAbsent(identifier, newFuture);if (futureModule != null) {return futureModule.getModule();}boolean ok = false;try {final ModuleLogger log = Module.log;log.trace("Locally loading module %s from %s", identifier, this);final long startTime = Metrics.getCurrentCPUTime();final ModuleSpec moduleSpec = findModule(identifier);loadTimeUpdater.addAndGet(this, Metrics.getCurrentCPUTime() - startTime);if (moduleSpec == null) {log.trace("Module %s not found from %s", identifier, this);return null;}if (! moduleSpec.getModuleIdentifier().equals(identifier)) {throw new ModuleLoadException("Module loader found a module with the wrong name");}final Module module;if ( moduleSpec instanceof AliasModuleSpec) {final ModuleIdentifier aliasTarget = ((AliasModuleSpec) moduleSpec).getAliasTarget();try {newFuture.setModule(module = loadModuleLocal(aliasTarget));} catch (RuntimeException e) {log.trace(e, "Failed to load module %s (alias for %s)", identifier, aliasTarget);throw e;} catch (Error e) {log.trace(e, "Failed to load module %s (alias for %s)", identifier, aliasTarget);throw e;}} else {module = defineModule((ConcreteModuleSpec) moduleSpec, newFuture);}log.trace("Loaded module %s from %s", identifier, this);ok = true;return module;} finally {if (! ok) {newFuture.setModule(null);moduleMap.remove(identifier, newFuture);}}}

     2.2.2.1 查找模块

protected ModuleSpec findModule(final ModuleIdentifier moduleIdentifier) throws ModuleLoadException {final String child = toPathString(moduleIdentifier);if (pathFilter.accept(child)) {for (File root : repoRoots) {final File file = new File(root, child);final File moduleXml = new File(file, "module.xml");if (moduleXml.exists()) {return parseModuleInfoFile(moduleIdentifier, file, moduleXml);}}}throw new ModuleNotFoundException("Module " + moduleIdentifier + " is not found in " + this);}

     2.2.2.1 解析模块

 

private ModuleSpec parseModuleInfoFile(final ModuleIdentifier moduleIdentifier, final File moduleRoot, final File moduleInfoFile) throws ModuleLoadException {
return ModuleXmlParser.parseModuleXml(moduleIdentifier, moduleRoot, moduleInfoFile);
}

static ModuleSpec parseModuleXml(final ModuleIdentifier moduleIdentifier, final File root, final File moduleInfoFile) throws ModuleLoadException {final FileInputStream fis;try {fis = new FileInputStream(moduleInfoFile);} catch (FileNotFoundException e) {throw new ModuleLoadException("No module.xml file found at " + moduleInfoFile);}try {return parseModuleXml(new ResourceRootFactory() {public ResourceLoader createResourceLoader(final String rootPath, final String loaderPath, final String loaderName) throws IOException {File file = new File(rootPath, loaderPath);if (file.isDirectory()) {return new FileResourceLoader(loaderName, file);} else {final JarFile jarFile = new JarFile(file, true);return new JarFileResourceLoader(loaderName, jarFile);}}}, root.getPath(), new BufferedInputStream(fis), moduleInfoFile.getPath(), moduleIdentifier);} finally {safeClose(fis);}} static ModuleSpec parseModuleXml(final ResourceRootFactory factory, final String rootPath, InputStream source, final String moduleInfoFile, final ModuleIdentifier moduleIdentifier) throws ModuleLoadException {try {final XMLInputFactory inputFactory = INPUT_FACTORY;setIfSupported(inputFactory, XMLInputFactory.IS_VALIDATING, Boolean.FALSE);setIfSupported(inputFactory, XMLInputFactory.SUPPORT_DTD, Boolean.FALSE);final XMLStreamReader streamReader = inputFactory.createXMLStreamReader(source);try {return parseDocument(factory, rootPath, streamReader, moduleIdentifier);} finally {safeClose(streamReader);}} catch (XMLStreamException e) {throw new ModuleLoadException("Error loading module from " + moduleInfoFile, e);}} private static ModuleSpec parseDocument(final ResourceRootFactory factory, final String rootPath, XMLStreamReader reader, final ModuleIdentifier moduleIdentifier) throws XMLStreamException {while (reader.hasNext()) {switch (reader.nextTag()) {case START_DOCUMENT: {return parseRootElement(factory, rootPath, reader, moduleIdentifier);}case START_ELEMENT: {final Element element = Element.of(reader.getName());switch (element) {case MODULE: {final ModuleSpec.Builder specBuilder = ModuleSpec.build(moduleIdentifier);parseModuleContents(factory, rootPath, reader, specBuilder);parseEndDocument(reader);return specBuilder.create();}case MODULE_ALIAS: {final ModuleSpec moduleSpec = parseModuleAliasContents(reader, moduleIdentifier);parseEndDocument(reader);return moduleSpec;}default: {throw unexpectedContent(reader);}}}default: {throw unexpectedContent(reader);}}}throw endOfDocument(reader.getLocation());}

 

private static void parseModuleContents(final ResourceRootFactory factory, final String rootPath, final XMLStreamReader reader, final ModuleSpec.Builder specBuilder) throws XMLStreamException {final int count = reader.getAttributeCount();String name = null;String slot = null;final Set<Attribute> required = EnumSet.of(Attribute.NAME);for (int i = 0; i < count; i ++) {final Attribute attribute = Attribute.of(reader.getAttributeName(i));required.remove(attribute);switch (attribute) {case NAME: name = reader.getAttributeValue(i); break;case SLOT: slot = reader.getAttributeValue(i); break;default: throw unexpectedContent(reader);}}if (! required.isEmpty()) {throw missingAttributes(reader.getLocation(), required);}if (! specBuilder.getIdentifier().equals(ModuleIdentifier.create(name, slot))) {throw invalidModuleName(reader.getLocation(), specBuilder.getIdentifier());}// xsd:allMultiplePathFilterBuilder exportsBuilder = PathFilters.multiplePathFilterBuilder(true);Set<Element> visited = EnumSet.noneOf(Element.class);while (reader.hasNext()) {switch (reader.nextTag()) {case END_ELEMENT: {specBuilder.addDependency(DependencySpec.createLocalDependencySpec(PathFilters.acceptAll(), exportsBuilder.create()));return;}case START_ELEMENT: {final Element element = Element.of(reader.getName());if (visited.contains(element)) {throw unexpectedContent(reader);}visited.add(element);switch (element) {case EXPORTS: parseFilterList(reader, exportsBuilder); break;case DEPENDENCIES: parseDependencies(reader, specBuilder); break;case MAIN_CLASS: parseMainClass(reader, specBuilder); break;case RESOURCES: parseResources(factory, rootPath, reader, specBuilder); break;case PROPERTIES: parseProperties(reader, specBuilder); break;default: throw unexpectedContent(reader);}break;}default: {throw unexpectedContent(reader);}}}throw endOfDocument(reader.getLocation());}

 

转载于:https://www.cnblogs.com/davidwang456/p/4029411.html

总结

以上是生活随笔为你收集整理的jboss7 加载module过程的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。