web.config-----------ConfigurationSettings 类解析

本文深入剖析了.NET Framework中ConfigurationSettings类的工作原理,包括其静态构造函数、静态方法及属性的内部实现细节。同时介绍了如何自定义配置节点,实现更灵活的配置管理。

 

 .Net Framework 源码分析

 

.Net Framework的源码是微软编程大师们智慧的结晶,是我们开发人员梦寐以求的知识宝藏。

挖掘这座宝藏是我们快速提升自身编程思想水平的重要途径。

下面是我研究分析 .Net Framework一部分代码后的一点心得,共享出来,希望对大家有所帮助,当然,分析不对的地方,还望指正,不胜感激。

System.Configuration.ConfigurationSettings

相信大家对这个类都不陌生吧。 ConfigurationSettings类重要的方法是(在我下面的分析中,方法也包括属性)

  • AppSettings属性 用于获取 元素配置节中的配置设置。
  • GetConfig方法 返回用户定义的配置节的配置设置。

在我们的项目开发中,我们经常通过 ConfigurationSettings.AppSettings["myKey"] 的方法 来获取 web.config 配置项上 appSettings 的配置值。调用这个ConfigurationSettings.AppSettings["myKey"]索引器我们就可以获取到 web.cofing 配置项 appSettings 的配置值,这太方便了。如果要我们设计一个这样的功能的时候,我们会有什么想法呢。 我的想法大概的是这样的:

1.        加载 web.config 配置文件的内容

2.        分析 web.config 配置文件配置项 appSettings 节点的内容,并加载到配置项管理类中。

3.        配置项管理类中应该有一个索引器,方便外部系统访问。

让我们来分析大师们是如何实现这个类的。看看大师级人物的代码和设计思路有何高明之处。

//ConfigurationSettings类的定义

public sealed class ConfigurationSettings

{

}

C# 关键字 sealed 表明此类是不能被继承的。

//静态构造函数

static ConfigurationSettings()

{

   _initState = InitState.NotStarted;

   _initLock = new object();

}

一个类最先运行的代码段就是静态构造函数,并且对于整个程序域而言静态构造函数只运行一次。
C#
关键字 static 加上类名称的方法函数就是静态构造函数。
对于一个类来说,只能有一个静态构造函数。
静态构造函数的作用主要是初始化静态变量。
C#关键字 static 约束的类方法里面的代码都只能调用 静态变量或者静态方法,静态属性等。

静态方法:C#关键字 static 约束的方法就是静态方法(有些教材可能会称为类方法),里面的代码都只能调用 静态变量或者静态方法,静态属性等。

//静态变量的定义代码

private static object _initLock;

C#关键字 static 表明此变量为静态变量。

//构造函数

private ConfigurationSettings()

{

}

发现上面的构造函数跟我们平时所写的类的构造函数有什么不同吗?
对了,就是访问权限的约束关键字 private ,平时构造函数的约束关键字都是 public
那么将构造函数访问权限设置为 private有什么目的呢?

1.        防止别人的代码通过 new 操作生成对象实例。

如:System.Configuration.ConfigurationSettings config = new System.Configuration.ConfigurationSettings();

你会发现上面的代码编译不通过,原因就是访问了 private 的构造函数,当然编译不通过啦!

2.        保证一个类仅有一个实例。

这里就是设计模式中的 Singleton 单件模式了,设置构造函数的访问权限为 private 是实现 Singleton 模式的前提

 //AppSettings静态只读属性

    public static NameValueCollection AppSettings

    {

       get

       {

           ReadOnlyNameValueCollection config = (ReadOnlyNameValueCollection) GetConfig("appSettings");

           if (config == null)

           {

               config = new ReadOnlyNameValueCollection(new

                 CaseInsensitiveHashCodeProvider(CultureInfo.InvariantCulture), new   CaseInsensitiveComparer(CultureInfo.InvariantCulture));

          config.SetReadOnly();

            }

        return config;

        }

     }

 

通过上面的代码我们可以知道,此属性为静态只读属性(static 关键字,只有 get 操作,而没有 set 操作)
因为 NameValueCollection 类定义了索引访问器,所以平时我们的代码都是这样写的 ConfigurationSettings.AppSettings["myKey"]
,对于["myKey"]这种使用 []号访问的索引器,我们下面分析NameValueCollection类时再说明索引器。

ReadOnlyNameValueCollection config = (ReadOnlyNameValueCollection) GetConfig("appSettings");
注意到参数的值是 appSettings 了吗?
是不是跟我们 web.config 里面的 appSettings 的配置节点项有关联呢?他们有什么关系吗?我们往下看。
这段代码调用了ConfigurationSettings类的另外一个静态方法,代码如下:

public static object GetConfig(string sectionName) //当然这时 sectionName == "appSettings"

{

   if ((sectionName == null) || (sectionName.Length == 0))

   //判断 string 的值是不是为Empty时,应该用 sectionName.Length == 0 来判断

   {

      return null;

   }

   if (_initState < InitState.Usable)

   {

      EnsureConfigurationSystem();

   }

   if (_initError != null)

   {

      throw _initError;

   }

   return _configSystem.GetConfig(sectionName);

}



代码段:

if (_initState < InitState.Usable)

{

   EnsureConfigurationSystem();

}

InitState 只是一个私有的枚举类型 enum

private enum InitState

{

   NotStarted,

   Started,

   Usable,

   Completed

}

刚才ConfigurationSettings类的静态构造函数是设置
initState = InitState.NotStarted;
那么第一次运行时,肯定会执行 EnsureConfigurationSystem()方法了,我们接着看看代码的实现

private static void EnsureConfigurationSystem()

{

   lock (_initLock)

   {

      if (_initState < InitState.Usable)

      {

         _initState = InitState.Started;

         try

         {

            _configSystem = new DefaultConfigurationSystem();

            _initState = InitState.Usable;  

         }

         catch (Exception exception)

         {

            _initError = exception;

            _initState = InitState.Completed;

            throw;

         } 

      }

   }

}

C#关键字 lock 加锁处理。
lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入一个锁定代码,则它将在释放该对象前一直等待(块)。
MSDN的解释:lock 关键字可将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。
通常,如果要保护实例变量,则 lock(this);如果要保护 static 变量(或者如果临界区出现在给定类的静态方法中),则 lock(typeOf (class))

 

  2007-7-24 13:57:32

 

 

  陈英豪

  
  
  
等级:版主
  
文章:17
  
积分:19
  
注册:2007-7-2

       

2

 

 

 

 

_configSystem = new DefaultConfigurationSystem();

private static IConfigurationSystem _configSystem;

_configSystem 是一个接口变量。
先看看接口 IConfigurationSystem 定义

public interface IConfigurationSystem

{

    // Methods

    object GetConfig(string configKey);

    void Init();

}

接着我们跟踪实现了 IConfigurationSystem 接口的 DefaultConfigurationSystem 类看看
类的定义:

internal class DefaultConfigurationSystem : IConfigurationSystem

{

}

C# 关键字 internal 表明此类只能被当前的 dll 里面的类使用。
顺便提一提 protected internal 这样的二个关键字的约束。它表明这个只能被当前 dll 里面的类使用或者不是当前 dll 里面的子类使用,记得是 或者 的关系
我们还是先从这个类的构造函数分析开始:

internal DefaultConfigurationSystem()

{

}

这里的构造函数使用 internal,并不是像 ConfigurationSettings 类构造函数的 private
它的访问权限比 ConfigurationSettings 的类的松一点,允许当前 dll 里面的类可以通过 new 操作来生成多个 DefaultConfigurationSystem 实例。
所以这里才有上面的代码:
_configSystem = new DefaultConfigurationSystem();
的代码调用。
重要方法GetConfig的部分关键代码内容:

object IConfigurationSystem.GetConfig(string configKey) //当然这里还是 configKey == "appSettings"

{

   if (!this._isAppConfigInited)

   {

      this.EnsureInit(configKey);

   }

   ConfigurationRecord record = null;

   if (record != null)

   {

     return record.GetConfig(configKey);

   }

   return null;

}

接下来我们就要分析 EnsureInit 方法。

private void EnsureInit(string configKey)

{

  try

  {

     ConfigurationRecord record = new ConfigurationRecord();

     bool flag2 = record.Load(this._machineFilename);

     //加载配置文件信息,这里是加载 machine.config 的信息,并不是 web.config的信息

     this._machineConfig = record;

     ///....省略

  }

  catch (Exception exception)

  {

     this._initError = exception;

     ConfigurationSettings.SetInitError(this._initError);

     this._isMachineConfigInited = true;

     this._isAppConfigInited = true;

     throw;

  }

  finally

  {

     lock (this)

     {

        ConfigurationSettings.CompleteConfigInit();

        Monitor.PulseAll(this);

     }

  }

}

这里只是加载 .Net Framework machine.config 全局配置信息,在这个配置信息项中,你可以找到这样的配置项。

<configuration>

 <configSections>

  <section name="appSettings" type="System.Configuration.NameValueFileSectionHandler, System"/>

 </configSections>

<configuration>

这个配置项是什么意思呢? name="appSettings"这里表示自定义的配置项键。也就是 appSettings
type="System.Configuration.NameValueFileSectionHandler, System"
表示 appSettings 这个自定义配置键的处理类是 System.Configuration.NameValueFileSectionHandler,后面的 System表示此类所在的 dll的名称。
System.Configuration.NameValueFileSectionHandler
这个类必须实现 IConfigurationSectionHandler 这个接口。下面的代码就会调用这个接口里面的方法来获取配置数据。
通过调用 ConfigurationRecord.GetConfig -->> ConfigurationRecord.ResolveConfig -->> ConfigurationRecord.Evaluate

private object Evaluate(string configKey) // 当然这里的值还是 appSettings

{

    IConfigurationSectionHandler factory = this.GetFactory(configKey); //工厂模式

    object config = (this._parent != null) ? this._parent.GetConfig(configKey) : null;

    string[] keys = configKey.Split(new char[] { '/' });

    XmlTextReader reader = null;

    object obj3 = null;

    try

    {

        reader = this.OpenXmlTextReader(this._filename);  //加载我们的 web.config 文件

        obj3 = this.EvaluateRecursive(factory, config, keys, 0, reader);  //调用自定义配置项处理类的接口方法获取数据。下面分析。

    }

    catch (ConfigurationException) //catch 的用法,先获取自定义的异常类,这才是好方法。

    {

        throw;

    }

    catch (Exception exception)

    {

        throw this.TranslateXmlParseOrEvaluateErrors(exception);

    }

    finally

    {

        if (reader != null)

        {

            reader.Close();

        }

    }

    //省略.....

    return obj3;

}

接下来的 GetFactory 的方法就是关键啦,为我们以后写自定义配置项类做参考了。

private IConfigurationSectionHandler GetFactory(string configKey)

{

    if ((this._factories != null) && this._factories.Contains(configKey))

    {

        object obj2 = this._factories[configKey];

        if (obj2 == RemovedFactorySingleton)

        {

            return null;

        }

        IConfigurationSectionHandler handler = obj2 as IConfigurationSectionHandler;

        //as 运算符用于执行可兼容类型之间的转换。

        //as 运算符类似于类型转换,所不同的是,当转换失败时,as 运算符将产生空,而不是引发异常。

        if (handler == null)

        {

            string typeName = (string) obj2;

            obj2 = null;

            new ReflectionPermission(PermissionState.Unrestricted).Assert();

            try

            {

                Type c = Type.GetType(typeName);

                if (c != null)

                {

                    if (!typeof(IConfigurationSectionHandler).IsAssignableFrom(c))

                    {

                        throw new ConfigurationException(SR.GetString("Type_doesnt_implement_IConfigSectionHandler", new object[] { typeName }));

                    }

                    obj2 = Activator.CreateInstance(c, BindingFlags.CreateInstance

                                | BindingFlags.NonPublic | BindingFlags.Public

                                | BindingFlags.Instance, null, null, null);

                    //Activator 就是 Net Framework 著名的反射机制的实现类啦。

                                      //Activator.CreateInstance可以动态创建某种类型的实例对象。

                    在这里,它创建了什么对象了,也就是我们上面分析的 System.Configuration.NameValueFileSectionHandler 类对象啦

                }

            }

            catch (Exception exception)

            {

                throw new ConfigurationException(exception.Message, exception);

            }

            finally

            {

                CodeAccessPermission.RevertAssert();

            }

            //省略

        }

        return handler;

    }

    if (!this._factoriesNoInherit && (this._parent != null))

    {

        return this._parent.GetFactory(configKey);

    }

    return null;

}

 

  2007-7-24 14:12:40

 

 

  陈英豪

  
  
  
等级:版主
  
文章:17
  
积分:19
  
注册:2007-7-2

       

3

 

 

 

 

接下来的 EvaluateRecursive 方法将会调用 System.Configuration.NameValueFileSectionHandler 类的接口方法 Create

private object EvaluateRecursive(IConfigurationSectionHandler factory, object config, string[] keys, int iKey, XmlTextReader reader)

{

    string text = keys[iKey];

    int depth = reader.Depth;

    do

    {

        if (!reader.Read())

        {

            break;

        }

    }

    while (reader.NodeType != XmlNodeType.Element);

    while (reader.Depth == (depth + 1))

    {

        if (reader.Name == text)

        {

            if (iKey < (keys.Length - 1))

            {

                config = this.EvaluateRecursive(factory, config, keys, iKey + 1, reader);

                continue;

            }

            CreatePermissionSetFromLocation(this._filename).PermitOnly();

            try

            {

                int line = reader.LineNumber;

                try

                {

                    ConfigXmlDocument document = new ConfigXmlDocument();

                    document.LoadSingleElement(this._filename, reader);

                    config = factory.Create(config, null, document.DocumentElement);

     //调用 System.Configuration.NameValueFileSectionHandler 类的方法了,

                    下面要进入 System.Configuration.NameValueFileSectionHandler 类的分析了。

                }

                catch (ConfigurationException)

                {

                    throw;

                }

                catch (XmlException)

                {

                    throw;

                }

                catch (Exception exception)

                {

                    throw new ConfigurationException(SR.GetString("Exception_in_config_section_handler"), exception, this._filename, line);

                }

                continue;

            }

            finally

            {

                CodeAccessPermission.RevertPermitOnly();

            }

        }

        this.StrictSkipToNextElement(reader);

    }

    return config;

}

IConfigurationSectionHandler 接口成员
由所有配置节处理程序实现,以分析配置节的 XML。返回的对象被添加到配置集合中,并通过 GetConfig 访问。

object Create(

   object parent,

   object configContext,

   XmlNode section

);

IConfigurationSectionHandler 接口是我们写自定义配置节点项时必须要实现的接口。下面再说。
NameValueFileSectionHandler
类的定义

public class NameValueFileSectionHandler : IConfigurationSectionHandler

{

    // Methods

    public NameValueFileSectionHandler();

    public object Create(object parent, object configContext, XmlNode section);

}

NameValueFileSectionHandler.Create 方法的实现非常简单,就是获取 参数中 XmlNode section 的数据,通过 key value 对应的关系 保存到 私有的 HashTable类型的变量中 section 的参数值大概是这样的

 <appSettings>

     <add key="ConnectionString" value="xxxxxxxxxx" />

        <add key="__SystemID__" value="xxxxxxxxxx" />

    </appSettings>

分析了 System.Configuration.ConfigurationSettings 后,来看看如何实现我们自定义的配置节点管理。
下面的示例代码我采用 VS.NET 的企业代码示例 Duwamish 项目来说明。

第一步,我们要自定义配置节点,web.config 配置节点示例如下:

<configuration>

  <configSections>

    <section name="DuwamishConfiguration" type="Duwamish7.Common.DuwamishConfiguration, Duwamish7.Common" />

  </configSections>

</configuration>




<DuwamishConfiguration> //注意这里就是自定义配置项节点了

    <add key="Duwamish.DataAccess.ConnectionString" value="server=.;User ID=sa;Password=password;database=Duwamish;Connection Reset=FALSE" />

    <add key="Duwamish.Web.EnablePageCache" value="True" />

    <add key="Duwamish.Web.PageCacheExpiresInSeconds" value="3600" />

    <add key="Duwamish.Web.EnableSsl" value="False" />

</DuwamishConfiguration>

第二步,让我们的自定义配置节点处理类实现 IConfigurationSectionHandler 接口

在这里是 dll名称为 Duwamish7.Common 的 Duwamish7.Common.DuwamishConfiguration的类要实现这个接口代码:

public Object Create(Object parent, object configContext, XmlNode section)

{   

    NameValueCollection settings;   

    try

    {

        NameValueSectionHandler baseHandler = new NameValueSectionHandler();

        settings = (NameValueCollection)baseHandler.Create(parent, configContext, section);

    }

    catch

    {

        settings = null;

    }   

    if ( settings == null )

    {

        dbConnectionString        = DATAACCESS_CONNECTIONSTRING_DEFAULT;

        pageCacheExpiresInSeconds = WEB_PAGECACHEEXPIRESINSECONDS_DEFAULT;

        enablePageCache           = WEB_ENABLEPAGECACHE_DEFAULT;

        enableSsl                 = WEB_ENABLESSL_DEFAULT;

    }

    else

    {

        dbConnectionString        = ApplicationConfiguration.ReadSetting(settings, DATAACCESS_CONNECTIONSTRING, DATAACCESS_CONNECTIONSTRING_DEFAULT);

        pageCacheExpiresInSeconds = ApplicationConfiguration.ReadSetting(settings, WEB_PAGECACHEEXPIRESINSECONDS, WEB_PAGECACHEEXPIRESINSECONDS_DEFAULT);

        enablePageCache           = ApplicationConfiguration.ReadSetting(settings, WEB_ENABLEPAGECACHE, WEB_ENABLEPAGECACHE_DEFAULT);

        enableSsl                 = ApplicationConfiguration.ReadSetting(settings, WEB_ENABLESSL, WEB_ENABLESSL_DEFAULT);

    }   

    return settings;

}

第三步,如何启动我们的自定义配置节点处理类

System.Configuration.ConfigurationSettings.GetConfig("DuwamishConfiguration");

到此,我们就搞掂了自定义配置节点管理了。自定义配置节点管理可以避免将很多的配置信息都放到 appSettings 节点中,便于管理。通过类来管理配置信息,可以在多个项目中重用,我们也可以写一个基类,来获取统一的配置项键管理。如在我们的项目中差不多每个 web.config 都会有

 <add key="__SystemID__" value="xxxx" />

 <add key="__SystemName__" value="xxxx" />

 <add key="__SystemPassword__" value="xxxx" />

如果我们的基类提供了获取这三个对应 key 值的配置项,其它的项目需要扩展时,只须继承我们的配置节点管理基类就OK了。

 

  2007-7-24 14:16:26

 

 

  陈英豪

  
  
  
等级:版主
  
文章:17
  
积分:19
  
注册:2007-7-2

       

4

 

 

 

 

好了,ConfigurationSettings 类我就分析到这里吧!

谢谢!

 

 

 
To honour the JVM settings for this build a new JVM will be forked. Please consider using the daemon: https://docs.gradle.org/5.6.4/userguide/gradle_daemon.html. Daemon will be stopped at the end of the build stopping after processing > Configure project : New Dep: net.minecraftforge:forge:1.12.2-14.23.5.2864_mapped_snapshot_20171003-1.12 > Task :dependencies ------------------------------------------------------------ Root project ------------------------------------------------------------ __obfuscated - Generated scope for obfuscated dependencies No dependencies _compileJava_1 +--- net.minecraft:client:1.12.2 | +--- com.mojang:patchy:1.3.9 | +--- oshi-project:oshi-core:1.1 | +--- net.java.dev.jna:jna:4.4.0 | +--- net.java.dev.jna:platform:3.4.0 | +--- com.ibm.icu:icu4j-core-mojang:51.2 | +--- net.sf.jopt-simple:jopt-simple:5.0.3 -> 5.0.4 | +--- com.paulscode:codecjorbis:20101023 | +--- com.paulscode:codecwav:20101023 | +--- com.paulscode:libraryjavasound:20101123 | +--- com.paulscode:librarylwjglopenal:20100824 | +--- com.paulscode:soundsystem:20120107 | +--- io.netty:netty-all:4.1.9.Final | +--- com.google.guava:guava:21.0 | +--- org.apache.commons:commons-lang3:3.5 | +--- commons-io:commons-io:2.5 | +--- commons-codec:commons-codec:1.10 | +--- net.java.jinput:jinput:2.0.5 | | +--- net.java.jutils:jutils:1.0.0 | | \--- net.java.jinput:jinput-platform:2.0.5 | +--- net.java.jutils:jutils:1.0.0 | +--- com.google.code.gson:gson:2.8.0 | +--- com.mojang:authlib:1.5.25 | +--- com.mojang:realms:1.10.22 | +--- org.apache.commons:commons-compress:1.8.1 | +--- org.apache.httpcomponents:httpclient:4.3.3 | | +--- org.apache.httpcomponents:httpcore:4.3.2 | | +--- commons-logging:commons-logging:1.1.3 | | \--- commons-codec:commons-codec:1.6 -> 1.10 | +--- commons-logging:commons-logging:1.1.3 | +--- org.apache.httpcomponents:httpcore:4.3.2 | +--- it.unimi.dsi:fastutil:7.1.0 | +--- org.apache.logging.log4j:log4j-api:2.8.1 -> 2.15.0 | +--- org.apache.logging.log4j:log4j-core:2.8.1 -> 2.15.0 | | \--- org.apache.logging.log4j:log4j-api:2.15.0 | +--- org.lwjgl.lwjgl:lwjgl:2.9.4-nightly-20150209 | +--- org.lwjgl.lwjgl:lwjgl_util:2.9.4-nightly-20150209 | +--- org.lwjgl.lwjgl:lwjgl-platform:2.9.4-nightly-20150209 | +--- net.java.jinput:jinput-platform:2.0.5 | +--- com.mojang:text2speech:1.10.3 | \--- com.google.code.findbugs:jsr305:3.0.1 +--- com.google.code.findbugs:jsr305:3.0.1 +--- net.minecraftforge:mergetool:1.0.13 | +--- org.ow2.asm:asm:6.2 | +--- org.ow2.asm:asm-tree:6.2 | | \--- org.ow2.asm:asm:6.2 | +--- org.ow2.asm:asm-util:6.2 | | +--- org.ow2.asm:asm:6.2 | | +--- org.ow2.asm:asm-tree:6.2 (*) | | \--- org.ow2.asm:asm-analysis:6.2 | | \--- org.ow2.asm:asm-tree:6.2 (*) | \--- net.sf.jopt-simple:jopt-simple:5.0.4 +--- org.ow2.asm:asm-debug-all:5.2 +--- net.minecraft:launchwrapper:1.12 +--- org.jline:jline:3.5.1 +--- com.typesafe.akka:akka-actor_2.11:2.3.3 | +--- org.scala-lang:scala-library:2.11.1 | \--- com.typesafe:config:1.2.1 +--- com.typesafe:config:1.2.1 +--- org.scala-lang:scala-actors-migration_2.11:1.1.0 | +--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 | +--- org.scala-lang:scala-actors:2.11.0 | | \--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 | \--- org.scala-lang.plugins:scala-continuations-library_2.11:1.0.1 -> 1.0.2_mc +--- org.scala-lang:scala-compiler:2.11.1 | +--- org.scala-lang:scala-library:2.11.1 | +--- org.scala-lang:scala-reflect:2.11.1 | | \--- org.scala-lang:scala-library:2.11.1 | +--- org.scala-lang.modules:scala-xml_2.11:1.0.2 | | \--- org.scala-lang:scala-library:2.11.1 | \--- org.scala-lang.modules:scala-parser-combinators_2.11:1.0.1 | \--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 +--- org.scala-lang.plugins:scala-continuations-library_2.11:1.0.2_mc +--- org.scala-lang.plugins:scala-continuations-plugin_2.11.1:1.0.2_mc +--- org.scala-lang:scala-library:2.11.1 +--- org.scala-lang:scala-parser-combinators_2.11:1.0.1 +--- org.scala-lang:scala-reflect:2.11.1 (*) +--- org.scala-lang:scala-swing_2.11:1.0.1 +--- org.scala-lang:scala-xml_2.11:1.0.2 +--- lzma:lzma:0.0.1 +--- java3d:vecmath:1.5.2 +--- net.sf.trove4j:trove4j:3.0.3 +--- org.apache.maven:maven-artifact:3.5.3 | +--- org.codehaus.plexus:plexus-utils:3.1.0 | \--- org.apache.commons:commons-lang3:3.5 +--- net.sf.jopt-simple:jopt-simple:5.0.3 -> 5.0.4 +--- org.apache.logging.log4j:log4j-api:2.15.0 +--- org.apache.logging.log4j:log4j-core:2.15.0 (*) \--- net.minecraftforge:legacydev:0.2.3.+ -> 0.2.3.1 annotationProcessor - Annotation processors and their dependencies for source set 'main'. No dependencies apiElements - API elements for main. (n) No dependencies archives - Configuration for archive artifacts. No dependencies compile - Dependencies for source set 'main' (deprecated, use 'implementation' instead). \--- net.minecraftforge:forge:1.12.2-14.23.5.2864_mapped_snapshot_20171003-1.12 +--- net.minecraft:client:1.12.2 | +--- com.mojang:patchy:1.3.9 | +--- oshi-project:oshi-core:1.1 | +--- net.java.dev.jna:jna:4.4.0 | +--- net.java.dev.jna:platform:3.4.0 | +--- com.ibm.icu:icu4j-core-mojang:51.2 | +--- net.sf.jopt-simple:jopt-simple:5.0.3 -> 5.0.4 | +--- com.paulscode:codecjorbis:20101023 | +--- com.paulscode:codecwav:20101023 | +--- com.paulscode:libraryjavasound:20101123 | +--- com.paulscode:librarylwjglopenal:20100824 | +--- com.paulscode:soundsystem:20120107 | +--- io.netty:netty-all:4.1.9.Final | +--- com.google.guava:guava:21.0 | +--- org.apache.commons:commons-lang3:3.5 | +--- commons-io:commons-io:2.5 | +--- commons-codec:commons-codec:1.10 | +--- net.java.jinput:jinput:2.0.5 | | +--- net.java.jutils:jutils:1.0.0 | | \--- net.java.jinput:jinput-platform:2.0.5 | +--- net.java.jutils:jutils:1.0.0 | +--- com.google.code.gson:gson:2.8.0 | +--- com.mojang:authlib:1.5.25 | +--- com.mojang:realms:1.10.22 | +--- org.apache.commons:commons-compress:1.8.1 | +--- org.apache.httpcomponents:httpclient:4.3.3 | | +--- org.apache.httpcomponents:httpcore:4.3.2 | | +--- commons-logging:commons-logging:1.1.3 | | \--- commons-codec:commons-codec:1.6 -> 1.10 | +--- commons-logging:commons-logging:1.1.3 | +--- org.apache.httpcomponents:httpcore:4.3.2 | +--- it.unimi.dsi:fastutil:7.1.0 | +--- org.apache.logging.log4j:log4j-api:2.8.1 -> 2.15.0 | +--- org.apache.logging.log4j:log4j-core:2.8.1 -> 2.15.0 | | \--- org.apache.logging.log4j:log4j-api:2.15.0 | +--- org.lwjgl.lwjgl:lwjgl:2.9.4-nightly-20150209 | +--- org.lwjgl.lwjgl:lwjgl_util:2.9.4-nightly-20150209 | +--- org.lwjgl.lwjgl:lwjgl-platform:2.9.4-nightly-20150209 | +--- net.java.jinput:jinput-platform:2.0.5 | +--- com.mojang:text2speech:1.10.3 | \--- com.google.code.findbugs:jsr305:3.0.1 +--- com.google.code.findbugs:jsr305:3.0.1 +--- net.minecraftforge:mergetool:1.0.13 | +--- org.ow2.asm:asm:6.2 | +--- org.ow2.asm:asm-tree:6.2 | | \--- org.ow2.asm:asm:6.2 | +--- org.ow2.asm:asm-util:6.2 | | +--- org.ow2.asm:asm:6.2 | | +--- org.ow2.asm:asm-tree:6.2 (*) | | \--- org.ow2.asm:asm-analysis:6.2 | | \--- org.ow2.asm:asm-tree:6.2 (*) | \--- net.sf.jopt-simple:jopt-simple:5.0.4 +--- net.minecraft:mappings_snapshot:20171003-1.12 +--- org.ow2.asm:asm-debug-all:5.2 +--- net.minecraft:launchwrapper:1.12 +--- org.jline:jline:3.5.1 +--- com.typesafe.akka:akka-actor_2.11:2.3.3 | +--- org.scala-lang:scala-library:2.11.1 | \--- com.typesafe:config:1.2.1 +--- com.typesafe:config:1.2.1 +--- org.scala-lang:scala-actors-migration_2.11:1.1.0 | +--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 | +--- org.scala-lang:scala-actors:2.11.0 | | \--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 | \--- org.scala-lang.plugins:scala-continuations-library_2.11:1.0.1 -> 1.0.2_mc +--- org.scala-lang:scala-compiler:2.11.1 | +--- org.scala-lang:scala-library:2.11.1 | +--- org.scala-lang:scala-reflect:2.11.1 | | \--- org.scala-lang:scala-library:2.11.1 | +--- org.scala-lang.modules:scala-xml_2.11:1.0.2 | | \--- org.scala-lang:scala-library:2.11.1 | \--- org.scala-lang.modules:scala-parser-combinators_2.11:1.0.1 | \--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 +--- org.scala-lang.plugins:scala-continuations-library_2.11:1.0.2_mc +--- org.scala-lang.plugins:scala-continuations-plugin_2.11.1:1.0.2_mc +--- org.scala-lang:scala-library:2.11.1 +--- org.scala-lang:scala-parser-combinators_2.11:1.0.1 +--- org.scala-lang:scala-reflect:2.11.1 (*) +--- org.scala-lang:scala-swing_2.11:1.0.1 +--- org.scala-lang:scala-xml_2.11:1.0.2 +--- lzma:lzma:0.0.1 +--- java3d:vecmath:1.5.2 +--- net.sf.trove4j:trove4j:3.0.3 +--- org.apache.maven:maven-artifact:3.5.3 | +--- org.codehaus.plexus:plexus-utils:3.1.0 | \--- org.apache.commons:commons-lang3:3.5 +--- net.sf.jopt-simple:jopt-simple:5.0.3 -> 5.0.4 +--- org.apache.logging.log4j:log4j-api:2.15.0 +--- org.apache.logging.log4j:log4j-core:2.15.0 (*) \--- net.minecraftforge:legacydev:0.2.3.+ -> 0.2.3.1 compileClasspath - Compile classpath for source set 'main'. \--- net.minecraftforge:forge:1.12.2-14.23.5.2864_mapped_snapshot_20171003-1.12 +--- net.minecraft:client:1.12.2 | +--- com.mojang:patchy:1.3.9 | +--- oshi-project:oshi-core:1.1 | +--- net.java.dev.jna:jna:4.4.0 | +--- net.java.dev.jna:platform:3.4.0 | +--- com.ibm.icu:icu4j-core-mojang:51.2 | +--- net.sf.jopt-simple:jopt-simple:5.0.3 | +--- com.paulscode:codecjorbis:20101023 | +--- com.paulscode:codecwav:20101023 | +--- com.paulscode:libraryjavasound:20101123 | +--- com.paulscode:librarylwjglopenal:20100824 | +--- com.paulscode:soundsystem:20120107 | +--- io.netty:netty-all:4.1.9.Final | +--- com.google.guava:guava:21.0 | +--- org.apache.commons:commons-lang3:3.5 | +--- commons-io:commons-io:2.5 | +--- commons-codec:commons-codec:1.10 | +--- net.java.jinput:jinput:2.0.5 | | \--- net.java.jutils:jutils:1.0.0 | +--- net.java.jutils:jutils:1.0.0 | +--- com.google.code.gson:gson:2.8.0 | +--- com.mojang:authlib:1.5.25 | +--- com.mojang:realms:1.10.22 | +--- org.apache.commons:commons-compress:1.8.1 | +--- org.apache.httpcomponents:httpclient:4.3.3 | | +--- org.apache.httpcomponents:httpcore:4.3.2 | | +--- commons-logging:commons-logging:1.1.3 | | \--- commons-codec:commons-codec:1.6 -> 1.10 | +--- commons-logging:commons-logging:1.1.3 | +--- org.apache.httpcomponents:httpcore:4.3.2 | +--- it.unimi.dsi:fastutil:7.1.0 | +--- org.apache.logging.log4j:log4j-api:2.8.1 -> 2.15.0 | +--- org.apache.logging.log4j:log4j-core:2.8.1 -> 2.15.0 | | \--- org.apache.logging.log4j:log4j-api:2.15.0 | +--- org.lwjgl.lwjgl:lwjgl:2.9.4-nightly-20150209 | +--- org.lwjgl.lwjgl:lwjgl_util:2.9.4-nightly-20150209 | +--- org.lwjgl.lwjgl:lwjgl-platform:2.9.4-nightly-20150209 | +--- com.mojang:text2speech:1.10.3 | \--- com.google.code.findbugs:jsr305:3.0.1 +--- com.google.code.findbugs:jsr305:3.0.1 +--- net.minecraftforge:mergetool:1.0.13 +--- net.minecraft:mappings_snapshot:20171003-1.12 +--- org.ow2.asm:asm-debug-all:5.2 +--- net.minecraft:launchwrapper:1.12 +--- org.jline:jline:3.5.1 +--- com.typesafe.akka:akka-actor_2.11:2.3.3 | +--- org.scala-lang:scala-library:2.11.1 | \--- com.typesafe:config:1.2.1 +--- com.typesafe:config:1.2.1 +--- org.scala-lang:scala-actors-migration_2.11:1.1.0 | +--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 | +--- org.scala-lang:scala-actors:2.11.0 | | \--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 | \--- org.scala-lang.plugins:scala-continuations-library_2.11:1.0.1 -> 1.0.2_mc +--- org.scala-lang:scala-compiler:2.11.1 | +--- org.scala-lang:scala-library:2.11.1 | +--- org.scala-lang:scala-reflect:2.11.1 | | \--- org.scala-lang:scala-library:2.11.1 | +--- org.scala-lang.modules:scala-xml_2.11:1.0.2 | | \--- org.scala-lang:scala-library:2.11.1 | \--- org.scala-lang.modules:scala-parser-combinators_2.11:1.0.1 | \--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 +--- org.scala-lang.plugins:scala-continuations-library_2.11:1.0.2_mc +--- org.scala-lang.plugins:scala-continuations-plugin_2.11.1:1.0.2_mc +--- org.scala-lang:scala-library:2.11.1 +--- org.scala-lang:scala-parser-combinators_2.11:1.0.1 +--- org.scala-lang:scala-reflect:2.11.1 (*) +--- org.scala-lang:scala-swing_2.11:1.0.1 +--- org.scala-lang:scala-xml_2.11:1.0.2 +--- lzma:lzma:0.0.1 +--- java3d:vecmath:1.5.2 +--- net.sf.trove4j:trove4j:3.0.3 +--- org.apache.maven:maven-artifact:3.5.3 | +--- org.codehaus.plexus:plexus-utils:3.1.0 | \--- org.apache.commons:commons-lang3:3.5 +--- net.sf.jopt-simple:jopt-simple:5.0.3 +--- org.apache.logging.log4j:log4j-api:2.15.0 +--- org.apache.logging.log4j:log4j-core:2.15.0 (*) \--- net.minecraftforge:legacydev:0.2.3.+ -> 0.2.3.1 compileOnly - Compile only dependencies for source set 'main'. No dependencies default - Configuration for default artifacts. \--- net.minecraftforge:forge:1.12.2-14.23.5.2864_mapped_snapshot_20171003-1.12 +--- net.minecraft:client:1.12.2 | +--- com.mojang:patchy:1.3.9 | +--- oshi-project:oshi-core:1.1 | +--- net.java.dev.jna:jna:4.4.0 | +--- net.java.dev.jna:platform:3.4.0 | +--- com.ibm.icu:icu4j-core-mojang:51.2 | +--- net.sf.jopt-simple:jopt-simple:5.0.3 -> 5.0.4 | +--- com.paulscode:codecjorbis:20101023 | +--- com.paulscode:codecwav:20101023 | +--- com.paulscode:libraryjavasound:20101123 | +--- com.paulscode:librarylwjglopenal:20100824 | +--- com.paulscode:soundsystem:20120107 | +--- io.netty:netty-all:4.1.9.Final | +--- com.google.guava:guava:21.0 | +--- org.apache.commons:commons-lang3:3.5 | +--- commons-io:commons-io:2.5 | +--- commons-codec:commons-codec:1.10 | +--- net.java.jinput:jinput:2.0.5 | | +--- net.java.jutils:jutils:1.0.0 | | \--- net.java.jinput:jinput-platform:2.0.5 | +--- net.java.jutils:jutils:1.0.0 | +--- com.google.code.gson:gson:2.8.0 | +--- com.mojang:authlib:1.5.25 | +--- com.mojang:realms:1.10.22 | +--- org.apache.commons:commons-compress:1.8.1 | +--- org.apache.httpcomponents:httpclient:4.3.3 | | +--- org.apache.httpcomponents:httpcore:4.3.2 | | +--- commons-logging:commons-logging:1.1.3 | | \--- commons-codec:commons-codec:1.6 -> 1.10 | +--- commons-logging:commons-logging:1.1.3 | +--- org.apache.httpcomponents:httpcore:4.3.2 | +--- it.unimi.dsi:fastutil:7.1.0 | +--- org.apache.logging.log4j:log4j-api:2.8.1 -> 2.15.0 | +--- org.apache.logging.log4j:log4j-core:2.8.1 -> 2.15.0 | | \--- org.apache.logging.log4j:log4j-api:2.15.0 | +--- org.lwjgl.lwjgl:lwjgl:2.9.4-nightly-20150209 | +--- org.lwjgl.lwjgl:lwjgl_util:2.9.4-nightly-20150209 | +--- org.lwjgl.lwjgl:lwjgl-platform:2.9.4-nightly-20150209 | +--- net.java.jinput:jinput-platform:2.0.5 | +--- com.mojang:text2speech:1.10.3 | \--- com.google.code.findbugs:jsr305:3.0.1 +--- com.google.code.findbugs:jsr305:3.0.1 +--- net.minecraftforge:mergetool:1.0.13 | +--- org.ow2.asm:asm:6.2 | +--- org.ow2.asm:asm-tree:6.2 | | \--- org.ow2.asm:asm:6.2 | +--- org.ow2.asm:asm-util:6.2 | | +--- org.ow2.asm:asm:6.2 | | +--- org.ow2.asm:asm-tree:6.2 (*) | | \--- org.ow2.asm:asm-analysis:6.2 | | \--- org.ow2.asm:asm-tree:6.2 (*) | \--- net.sf.jopt-simple:jopt-simple:5.0.4 +--- net.minecraft:mappings_snapshot:20171003-1.12 +--- org.ow2.asm:asm-debug-all:5.2 +--- net.minecraft:launchwrapper:1.12 +--- org.jline:jline:3.5.1 +--- com.typesafe.akka:akka-actor_2.11:2.3.3 | +--- org.scala-lang:scala-library:2.11.1 | \--- com.typesafe:config:1.2.1 +--- com.typesafe:config:1.2.1 +--- org.scala-lang:scala-actors-migration_2.11:1.1.0 | +--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 | +--- org.scala-lang:scala-actors:2.11.0 | | \--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 | \--- org.scala-lang.plugins:scala-continuations-library_2.11:1.0.1 -> 1.0.2_mc +--- org.scala-lang:scala-compiler:2.11.1 | +--- org.scala-lang:scala-library:2.11.1 | +--- org.scala-lang:scala-reflect:2.11.1 | | \--- org.scala-lang:scala-library:2.11.1 | +--- org.scala-lang.modules:scala-xml_2.11:1.0.2 | | \--- org.scala-lang:scala-library:2.11.1 | \--- org.scala-lang.modules:scala-parser-combinators_2.11:1.0.1 | \--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 +--- org.scala-lang.plugins:scala-continuations-library_2.11:1.0.2_mc +--- org.scala-lang.plugins:scala-continuations-plugin_2.11.1:1.0.2_mc +--- org.scala-lang:scala-library:2.11.1 +--- org.scala-lang:scala-parser-combinators_2.11:1.0.1 +--- org.scala-lang:scala-reflect:2.11.1 (*) +--- org.scala-lang:scala-swing_2.11:1.0.1 +--- org.scala-lang:scala-xml_2.11:1.0.2 +--- lzma:lzma:0.0.1 +--- java3d:vecmath:1.5.2 +--- net.sf.trove4j:trove4j:3.0.3 +--- org.apache.maven:maven-artifact:3.5.3 | +--- org.codehaus.plexus:plexus-utils:3.1.0 | \--- org.apache.commons:commons-lang3:3.5 +--- net.sf.jopt-simple:jopt-simple:5.0.3 -> 5.0.4 +--- org.apache.logging.log4j:log4j-api:2.15.0 +--- org.apache.logging.log4j:log4j-core:2.15.0 (*) \--- net.minecraftforge:legacydev:0.2.3.+ -> 0.2.3.1 deobf No dependencies implementation - Implementation only dependencies for source set 'main'. (n) No dependencies minecraft \--- net.minecraftforge:forge:1.12.2-14.23.5.2864_mapped_snapshot_20171003-1.12 +--- net.minecraft:client:1.12.2 | +--- com.mojang:patchy:1.3.9 | +--- oshi-project:oshi-core:1.1 | +--- net.java.dev.jna:jna:4.4.0 | +--- net.java.dev.jna:platform:3.4.0 | +--- com.ibm.icu:icu4j-core-mojang:51.2 | +--- net.sf.jopt-simple:jopt-simple:5.0.3 -> 5.0.4 | +--- com.paulscode:codecjorbis:20101023 | +--- com.paulscode:codecwav:20101023 | +--- com.paulscode:libraryjavasound:20101123 | +--- com.paulscode:librarylwjglopenal:20100824 | +--- com.paulscode:soundsystem:20120107 | +--- io.netty:netty-all:4.1.9.Final | +--- com.google.guava:guava:21.0 | +--- org.apache.commons:commons-lang3:3.5 | +--- commons-io:commons-io:2.5 | +--- commons-codec:commons-codec:1.10 | +--- net.java.jinput:jinput:2.0.5 | | +--- net.java.jutils:jutils:1.0.0 | | \--- net.java.jinput:jinput-platform:2.0.5 | +--- net.java.jutils:jutils:1.0.0 | +--- com.google.code.gson:gson:2.8.0 | +--- com.mojang:authlib:1.5.25 | +--- com.mojang:realms:1.10.22 | +--- org.apache.commons:commons-compress:1.8.1 | +--- org.apache.httpcomponents:httpclient:4.3.3 | | +--- org.apache.httpcomponents:httpcore:4.3.2 | | +--- commons-logging:commons-logging:1.1.3 | | \--- commons-codec:commons-codec:1.6 -> 1.10 | +--- commons-logging:commons-logging:1.1.3 | +--- org.apache.httpcomponents:httpcore:4.3.2 | +--- it.unimi.dsi:fastutil:7.1.0 | +--- org.apache.logging.log4j:log4j-api:2.8.1 -> 2.15.0 | +--- org.apache.logging.log4j:log4j-core:2.8.1 -> 2.15.0 | | \--- org.apache.logging.log4j:log4j-api:2.15.0 | +--- org.lwjgl.lwjgl:lwjgl:2.9.4-nightly-20150209 | +--- org.lwjgl.lwjgl:lwjgl_util:2.9.4-nightly-20150209 | +--- org.lwjgl.lwjgl:lwjgl-platform:2.9.4-nightly-20150209 | +--- net.java.jinput:jinput-platform:2.0.5 | +--- com.mojang:text2speech:1.10.3 | \--- com.google.code.findbugs:jsr305:3.0.1 +--- com.google.code.findbugs:jsr305:3.0.1 +--- net.minecraftforge:mergetool:1.0.13 | +--- org.ow2.asm:asm:6.2 | +--- org.ow2.asm:asm-tree:6.2 | | \--- org.ow2.asm:asm:6.2 | +--- org.ow2.asm:asm-util:6.2 | | +--- org.ow2.asm:asm:6.2 | | +--- org.ow2.asm:asm-tree:6.2 (*) | | \--- org.ow2.asm:asm-analysis:6.2 | | \--- org.ow2.asm:asm-tree:6.2 (*) | \--- net.sf.jopt-simple:jopt-simple:5.0.4 +--- net.minecraft:mappings_snapshot:20171003-1.12 +--- org.ow2.asm:asm-debug-all:5.2 +--- net.minecraft:launchwrapper:1.12 +--- org.jline:jline:3.5.1 +--- com.typesafe.akka:akka-actor_2.11:2.3.3 | +--- org.scala-lang:scala-library:2.11.1 | \--- com.typesafe:config:1.2.1 +--- com.typesafe:config:1.2.1 +--- org.scala-lang:scala-actors-migration_2.11:1.1.0 | +--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 | +--- org.scala-lang:scala-actors:2.11.0 | | \--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 | \--- org.scala-lang.plugins:scala-continuations-library_2.11:1.0.1 -> 1.0.2_mc +--- org.scala-lang:scala-compiler:2.11.1 | +--- org.scala-lang:scala-library:2.11.1 | +--- org.scala-lang:scala-reflect:2.11.1 | | \--- org.scala-lang:scala-library:2.11.1 | +--- org.scala-lang.modules:scala-xml_2.11:1.0.2 | | \--- org.scala-lang:scala-library:2.11.1 | \--- org.scala-lang.modules:scala-parser-combinators_2.11:1.0.1 | \--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 +--- org.scala-lang.plugins:scala-continuations-library_2.11:1.0.2_mc +--- org.scala-lang.plugins:scala-continuations-plugin_2.11.1:1.0.2_mc +--- org.scala-lang:scala-library:2.11.1 +--- org.scala-lang:scala-parser-combinators_2.11:1.0.1 +--- org.scala-lang:scala-reflect:2.11.1 (*) +--- org.scala-lang:scala-swing_2.11:1.0.1 +--- org.scala-lang:scala-xml_2.11:1.0.2 +--- lzma:lzma:0.0.1 +--- java3d:vecmath:1.5.2 +--- net.sf.trove4j:trove4j:3.0.3 +--- org.apache.maven:maven-artifact:3.5.3 | +--- org.codehaus.plexus:plexus-utils:3.1.0 | \--- org.apache.commons:commons-lang3:3.5 +--- net.sf.jopt-simple:jopt-simple:5.0.3 -> 5.0.4 +--- org.apache.logging.log4j:log4j-api:2.15.0 +--- org.apache.logging.log4j:log4j-core:2.15.0 (*) \--- net.minecraftforge:legacydev:0.2.3.+ -> 0.2.3.1 runtime - Runtime dependencies for source set 'main' (deprecated, use 'runtimeOnly' instead). \--- net.minecraftforge:forge:1.12.2-14.23.5.2864_mapped_snapshot_20171003-1.12 +--- net.minecraft:client:1.12.2 | +--- com.mojang:patchy:1.3.9 | +--- oshi-project:oshi-core:1.1 | +--- net.java.dev.jna:jna:4.4.0 | +--- net.java.dev.jna:platform:3.4.0 | +--- com.ibm.icu:icu4j-core-mojang:51.2 | +--- net.sf.jopt-simple:jopt-simple:5.0.3 -> 5.0.4 | +--- com.paulscode:codecjorbis:20101023 | +--- com.paulscode:codecwav:20101023 | +--- com.paulscode:libraryjavasound:20101123 | +--- com.paulscode:librarylwjglopenal:20100824 | +--- com.paulscode:soundsystem:20120107 | +--- io.netty:netty-all:4.1.9.Final | +--- com.google.guava:guava:21.0 | +--- org.apache.commons:commons-lang3:3.5 | +--- commons-io:commons-io:2.5 | +--- commons-codec:commons-codec:1.10 | +--- net.java.jinput:jinput:2.0.5 | | +--- net.java.jutils:jutils:1.0.0 | | \--- net.java.jinput:jinput-platform:2.0.5 | +--- net.java.jutils:jutils:1.0.0 | +--- com.google.code.gson:gson:2.8.0 | +--- com.mojang:authlib:1.5.25 | +--- com.mojang:realms:1.10.22 | +--- org.apache.commons:commons-compress:1.8.1 | +--- org.apache.httpcomponents:httpclient:4.3.3 | | +--- org.apache.httpcomponents:httpcore:4.3.2 | | +--- commons-logging:commons-logging:1.1.3 | | \--- commons-codec:commons-codec:1.6 -> 1.10 | +--- commons-logging:commons-logging:1.1.3 | +--- org.apache.httpcomponents:httpcore:4.3.2 | +--- it.unimi.dsi:fastutil:7.1.0 | +--- org.apache.logging.log4j:log4j-api:2.8.1 -> 2.15.0 | +--- org.apache.logging.log4j:log4j-core:2.8.1 -> 2.15.0 | | \--- org.apache.logging.log4j:log4j-api:2.15.0 | +--- org.lwjgl.lwjgl:lwjgl:2.9.4-nightly-20150209 | +--- org.lwjgl.lwjgl:lwjgl_util:2.9.4-nightly-20150209 | +--- org.lwjgl.lwjgl:lwjgl-platform:2.9.4-nightly-20150209 | +--- net.java.jinput:jinput-platform:2.0.5 | +--- com.mojang:text2speech:1.10.3 | \--- com.google.code.findbugs:jsr305:3.0.1 +--- com.google.code.findbugs:jsr305:3.0.1 +--- net.minecraftforge:mergetool:1.0.13 | +--- org.ow2.asm:asm:6.2 | +--- org.ow2.asm:asm-tree:6.2 | | \--- org.ow2.asm:asm:6.2 | +--- org.ow2.asm:asm-util:6.2 | | +--- org.ow2.asm:asm:6.2 | | +--- org.ow2.asm:asm-tree:6.2 (*) | | \--- org.ow2.asm:asm-analysis:6.2 | | \--- org.ow2.asm:asm-tree:6.2 (*) | \--- net.sf.jopt-simple:jopt-simple:5.0.4 +--- net.minecraft:mappings_snapshot:20171003-1.12 +--- org.ow2.asm:asm-debug-all:5.2 +--- net.minecraft:launchwrapper:1.12 +--- org.jline:jline:3.5.1 +--- com.typesafe.akka:akka-actor_2.11:2.3.3 | +--- org.scala-lang:scala-library:2.11.1 | \--- com.typesafe:config:1.2.1 +--- com.typesafe:config:1.2.1 +--- org.scala-lang:scala-actors-migration_2.11:1.1.0 | +--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 | +--- org.scala-lang:scala-actors:2.11.0 | | \--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 | \--- org.scala-lang.plugins:scala-continuations-library_2.11:1.0.1 -> 1.0.2_mc +--- org.scala-lang:scala-compiler:2.11.1 | +--- org.scala-lang:scala-library:2.11.1 | +--- org.scala-lang:scala-reflect:2.11.1 | | \--- org.scala-lang:scala-library:2.11.1 | +--- org.scala-lang.modules:scala-xml_2.11:1.0.2 | | \--- org.scala-lang:scala-library:2.11.1 | \--- org.scala-lang.modules:scala-parser-combinators_2.11:1.0.1 | \--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 +--- org.scala-lang.plugins:scala-continuations-library_2.11:1.0.2_mc +--- org.scala-lang.plugins:scala-continuations-plugin_2.11.1:1.0.2_mc +--- org.scala-lang:scala-library:2.11.1 +--- org.scala-lang:scala-parser-combinators_2.11:1.0.1 +--- org.scala-lang:scala-reflect:2.11.1 (*) +--- org.scala-lang:scala-swing_2.11:1.0.1 +--- org.scala-lang:scala-xml_2.11:1.0.2 +--- lzma:lzma:0.0.1 +--- java3d:vecmath:1.5.2 +--- net.sf.trove4j:trove4j:3.0.3 +--- org.apache.maven:maven-artifact:3.5.3 | +--- org.codehaus.plexus:plexus-utils:3.1.0 | \--- org.apache.commons:commons-lang3:3.5 +--- net.sf.jopt-simple:jopt-simple:5.0.3 -> 5.0.4 +--- org.apache.logging.log4j:log4j-api:2.15.0 +--- org.apache.logging.log4j:log4j-core:2.15.0 (*) \--- net.minecraftforge:legacydev:0.2.3.+ -> 0.2.3.1 runtimeClasspath - Runtime classpath of source set 'main'. \--- net.minecraftforge:forge:1.12.2-14.23.5.2864_mapped_snapshot_20171003-1.12 +--- net.minecraft:client:1.12.2 | +--- com.mojang:patchy:1.3.9 | +--- oshi-project:oshi-core:1.1 | +--- net.java.dev.jna:jna:4.4.0 | +--- net.java.dev.jna:platform:3.4.0 | +--- com.ibm.icu:icu4j-core-mojang:51.2 | +--- net.sf.jopt-simple:jopt-simple:5.0.3 -> 5.0.4 | +--- com.paulscode:codecjorbis:20101023 | +--- com.paulscode:codecwav:20101023 | +--- com.paulscode:libraryjavasound:20101123 | +--- com.paulscode:librarylwjglopenal:20100824 | +--- com.paulscode:soundsystem:20120107 | +--- io.netty:netty-all:4.1.9.Final | +--- com.google.guava:guava:21.0 | +--- org.apache.commons:commons-lang3:3.5 | +--- commons-io:commons-io:2.5 | +--- commons-codec:commons-codec:1.10 | +--- net.java.jinput:jinput:2.0.5 | | +--- net.java.jutils:jutils:1.0.0 | | \--- net.java.jinput:jinput-platform:2.0.5 | +--- net.java.jutils:jutils:1.0.0 | +--- com.google.code.gson:gson:2.8.0 | +--- com.mojang:authlib:1.5.25 | +--- com.mojang:realms:1.10.22 | +--- org.apache.commons:commons-compress:1.8.1 | +--- org.apache.httpcomponents:httpclient:4.3.3 | | +--- org.apache.httpcomponents:httpcore:4.3.2 | | +--- commons-logging:commons-logging:1.1.3 | | \--- commons-codec:commons-codec:1.6 -> 1.10 | +--- commons-logging:commons-logging:1.1.3 | +--- org.apache.httpcomponents:httpcore:4.3.2 | +--- it.unimi.dsi:fastutil:7.1.0 | +--- org.apache.logging.log4j:log4j-api:2.8.1 -> 2.15.0 | +--- org.apache.logging.log4j:log4j-core:2.8.1 -> 2.15.0 | | \--- org.apache.logging.log4j:log4j-api:2.15.0 | +--- org.lwjgl.lwjgl:lwjgl:2.9.4-nightly-20150209 | +--- org.lwjgl.lwjgl:lwjgl_util:2.9.4-nightly-20150209 | +--- org.lwjgl.lwjgl:lwjgl-platform:2.9.4-nightly-20150209 | +--- net.java.jinput:jinput-platform:2.0.5 | +--- com.mojang:text2speech:1.10.3 | \--- com.google.code.findbugs:jsr305:3.0.1 +--- com.google.code.findbugs:jsr305:3.0.1 +--- net.minecraftforge:mergetool:1.0.13 | +--- org.ow2.asm:asm:6.2 | +--- org.ow2.asm:asm-tree:6.2 | | \--- org.ow2.asm:asm:6.2 | +--- org.ow2.asm:asm-util:6.2 | | +--- org.ow2.asm:asm:6.2 | | +--- org.ow2.asm:asm-tree:6.2 (*) | | \--- org.ow2.asm:asm-analysis:6.2 | | \--- org.ow2.asm:asm-tree:6.2 (*) | \--- net.sf.jopt-simple:jopt-simple:5.0.4 +--- net.minecraft:mappings_snapshot:20171003-1.12 +--- org.ow2.asm:asm-debug-all:5.2 +--- net.minecraft:launchwrapper:1.12 +--- org.jline:jline:3.5.1 +--- com.typesafe.akka:akka-actor_2.11:2.3.3 | +--- org.scala-lang:scala-library:2.11.1 | \--- com.typesafe:config:1.2.1 +--- com.typesafe:config:1.2.1 +--- org.scala-lang:scala-actors-migration_2.11:1.1.0 | +--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 | +--- org.scala-lang:scala-actors:2.11.0 | | \--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 | \--- org.scala-lang.plugins:scala-continuations-library_2.11:1.0.1 -> 1.0.2_mc +--- org.scala-lang:scala-compiler:2.11.1 | +--- org.scala-lang:scala-library:2.11.1 | +--- org.scala-lang:scala-reflect:2.11.1 | | \--- org.scala-lang:scala-library:2.11.1 | +--- org.scala-lang.modules:scala-xml_2.11:1.0.2 | | \--- org.scala-lang:scala-library:2.11.1 | \--- org.scala-lang.modules:scala-parser-combinators_2.11:1.0.1 | \--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 +--- org.scala-lang.plugins:scala-continuations-library_2.11:1.0.2_mc +--- org.scala-lang.plugins:scala-continuations-plugin_2.11.1:1.0.2_mc +--- org.scala-lang:scala-library:2.11.1 +--- org.scala-lang:scala-parser-combinators_2.11:1.0.1 +--- org.scala-lang:scala-reflect:2.11.1 (*) +--- org.scala-lang:scala-swing_2.11:1.0.1 +--- org.scala-lang:scala-xml_2.11:1.0.2 +--- lzma:lzma:0.0.1 +--- java3d:vecmath:1.5.2 +--- net.sf.trove4j:trove4j:3.0.3 +--- org.apache.maven:maven-artifact:3.5.3 | +--- org.codehaus.plexus:plexus-utils:3.1.0 | \--- org.apache.commons:commons-lang3:3.5 +--- net.sf.jopt-simple:jopt-simple:5.0.3 -> 5.0.4 +--- org.apache.logging.log4j:log4j-api:2.15.0 +--- org.apache.logging.log4j:log4j-core:2.15.0 (*) \--- net.minecraftforge:legacydev:0.2.3.+ -> 0.2.3.1 runtimeElements - Elements of runtime for main. (n) No dependencies runtimeOnly - Runtime only dependencies for source set 'main'. (n) No dependencies testAnnotationProcessor - Annotation processors and their dependencies for source set 'test'. No dependencies testCompile - Dependencies for source set 'test' (deprecated, use 'testImplementation' instead). \--- net.minecraftforge:forge:1.12.2-14.23.5.2864_mapped_snapshot_20171003-1.12 +--- net.minecraft:client:1.12.2 | +--- com.mojang:patchy:1.3.9 | +--- oshi-project:oshi-core:1.1 | +--- net.java.dev.jna:jna:4.4.0 | +--- net.java.dev.jna:platform:3.4.0 | +--- com.ibm.icu:icu4j-core-mojang:51.2 | +--- net.sf.jopt-simple:jopt-simple:5.0.3 -> 5.0.4 | +--- com.paulscode:codecjorbis:20101023 | +--- com.paulscode:codecwav:20101023 | +--- com.paulscode:libraryjavasound:20101123 | +--- com.paulscode:librarylwjglopenal:20100824 | +--- com.paulscode:soundsystem:20120107 | +--- io.netty:netty-all:4.1.9.Final | +--- com.google.guava:guava:21.0 | +--- org.apache.commons:commons-lang3:3.5 | +--- commons-io:commons-io:2.5 | +--- commons-codec:commons-codec:1.10 | +--- net.java.jinput:jinput:2.0.5 | | +--- net.java.jutils:jutils:1.0.0 | | \--- net.java.jinput:jinput-platform:2.0.5 | +--- net.java.jutils:jutils:1.0.0 | +--- com.google.code.gson:gson:2.8.0 | +--- com.mojang:authlib:1.5.25 | +--- com.mojang:realms:1.10.22 | +--- org.apache.commons:commons-compress:1.8.1 | +--- org.apache.httpcomponents:httpclient:4.3.3 | | +--- org.apache.httpcomponents:httpcore:4.3.2 | | +--- commons-logging:commons-logging:1.1.3 | | \--- commons-codec:commons-codec:1.6 -> 1.10 | +--- commons-logging:commons-logging:1.1.3 | +--- org.apache.httpcomponents:httpcore:4.3.2 | +--- it.unimi.dsi:fastutil:7.1.0 | +--- org.apache.logging.log4j:log4j-api:2.8.1 -> 2.15.0 | +--- org.apache.logging.log4j:log4j-core:2.8.1 -> 2.15.0 | | \--- org.apache.logging.log4j:log4j-api:2.15.0 | +--- org.lwjgl.lwjgl:lwjgl:2.9.4-nightly-20150209 | +--- org.lwjgl.lwjgl:lwjgl_util:2.9.4-nightly-20150209 | +--- org.lwjgl.lwjgl:lwjgl-platform:2.9.4-nightly-20150209 | +--- net.java.jinput:jinput-platform:2.0.5 | +--- com.mojang:text2speech:1.10.3 | \--- com.google.code.findbugs:jsr305:3.0.1 +--- com.google.code.findbugs:jsr305:3.0.1 +--- net.minecraftforge:mergetool:1.0.13 | +--- org.ow2.asm:asm:6.2 | +--- org.ow2.asm:asm-tree:6.2 | | \--- org.ow2.asm:asm:6.2 | +--- org.ow2.asm:asm-util:6.2 | | +--- org.ow2.asm:asm:6.2 | | +--- org.ow2.asm:asm-tree:6.2 (*) | | \--- org.ow2.asm:asm-analysis:6.2 | | \--- org.ow2.asm:asm-tree:6.2 (*) | \--- net.sf.jopt-simple:jopt-simple:5.0.4 +--- net.minecraft:mappings_snapshot:20171003-1.12 +--- org.ow2.asm:asm-debug-all:5.2 +--- net.minecraft:launchwrapper:1.12 +--- org.jline:jline:3.5.1 +--- com.typesafe.akka:akka-actor_2.11:2.3.3 | +--- org.scala-lang:scala-library:2.11.1 | \--- com.typesafe:config:1.2.1 +--- com.typesafe:config:1.2.1 +--- org.scala-lang:scala-actors-migration_2.11:1.1.0 | +--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 | +--- org.scala-lang:scala-actors:2.11.0 | | \--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 | \--- org.scala-lang.plugins:scala-continuations-library_2.11:1.0.1 -> 1.0.2_mc +--- org.scala-lang:scala-compiler:2.11.1 | +--- org.scala-lang:scala-library:2.11.1 | +--- org.scala-lang:scala-reflect:2.11.1 | | \--- org.scala-lang:scala-library:2.11.1 | +--- org.scala-lang.modules:scala-xml_2.11:1.0.2 | | \--- org.scala-lang:scala-library:2.11.1 | \--- org.scala-lang.modules:scala-parser-combinators_2.11:1.0.1 | \--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 +--- org.scala-lang.plugins:scala-continuations-library_2.11:1.0.2_mc +--- org.scala-lang.plugins:scala-continuations-plugin_2.11.1:1.0.2_mc +--- org.scala-lang:scala-library:2.11.1 +--- org.scala-lang:scala-parser-combinators_2.11:1.0.1 +--- org.scala-lang:scala-reflect:2.11.1 (*) +--- org.scala-lang:scala-swing_2.11:1.0.1 +--- org.scala-lang:scala-xml_2.11:1.0.2 +--- lzma:lzma:0.0.1 +--- java3d:vecmath:1.5.2 +--- net.sf.trove4j:trove4j:3.0.3 +--- org.apache.maven:maven-artifact:3.5.3 | +--- org.codehaus.plexus:plexus-utils:3.1.0 | \--- org.apache.commons:commons-lang3:3.5 +--- net.sf.jopt-simple:jopt-simple:5.0.3 -> 5.0.4 +--- org.apache.logging.log4j:log4j-api:2.15.0 +--- org.apache.logging.log4j:log4j-core:2.15.0 (*) \--- net.minecraftforge:legacydev:0.2.3.+ -> 0.2.3.1 testCompileClasspath - Compile classpath for source set 'test'. \--- net.minecraftforge:forge:1.12.2-14.23.5.2864_mapped_snapshot_20171003-1.12 +--- net.minecraft:client:1.12.2 | +--- com.mojang:patchy:1.3.9 | +--- oshi-project:oshi-core:1.1 | +--- net.java.dev.jna:jna:4.4.0 | +--- net.java.dev.jna:platform:3.4.0 | +--- com.ibm.icu:icu4j-core-mojang:51.2 | +--- net.sf.jopt-simple:jopt-simple:5.0.3 | +--- com.paulscode:codecjorbis:20101023 | +--- com.paulscode:codecwav:20101023 | +--- com.paulscode:libraryjavasound:20101123 | +--- com.paulscode:librarylwjglopenal:20100824 | +--- com.paulscode:soundsystem:20120107 | +--- io.netty:netty-all:4.1.9.Final | +--- com.google.guava:guava:21.0 | +--- org.apache.commons:commons-lang3:3.5 | +--- commons-io:commons-io:2.5 | +--- commons-codec:commons-codec:1.10 | +--- net.java.jinput:jinput:2.0.5 | | \--- net.java.jutils:jutils:1.0.0 | +--- net.java.jutils:jutils:1.0.0 | +--- com.google.code.gson:gson:2.8.0 | +--- com.mojang:authlib:1.5.25 | +--- com.mojang:realms:1.10.22 | +--- org.apache.commons:commons-compress:1.8.1 | +--- org.apache.httpcomponents:httpclient:4.3.3 | | +--- org.apache.httpcomponents:httpcore:4.3.2 | | +--- commons-logging:commons-logging:1.1.3 | | \--- commons-codec:commons-codec:1.6 -> 1.10 | +--- commons-logging:commons-logging:1.1.3 | +--- org.apache.httpcomponents:httpcore:4.3.2 | +--- it.unimi.dsi:fastutil:7.1.0 | +--- org.apache.logging.log4j:log4j-api:2.8.1 -> 2.15.0 | +--- org.apache.logging.log4j:log4j-core:2.8.1 -> 2.15.0 | | \--- org.apache.logging.log4j:log4j-api:2.15.0 | +--- org.lwjgl.lwjgl:lwjgl:2.9.4-nightly-20150209 | +--- org.lwjgl.lwjgl:lwjgl_util:2.9.4-nightly-20150209 | +--- org.lwjgl.lwjgl:lwjgl-platform:2.9.4-nightly-20150209 | +--- com.mojang:text2speech:1.10.3 | \--- com.google.code.findbugs:jsr305:3.0.1 +--- com.google.code.findbugs:jsr305:3.0.1 +--- net.minecraftforge:mergetool:1.0.13 +--- net.minecraft:mappings_snapshot:20171003-1.12 +--- org.ow2.asm:asm-debug-all:5.2 +--- net.minecraft:launchwrapper:1.12 +--- org.jline:jline:3.5.1 +--- com.typesafe.akka:akka-actor_2.11:2.3.3 | +--- org.scala-lang:scala-library:2.11.1 | \--- com.typesafe:config:1.2.1 +--- com.typesafe:config:1.2.1 +--- org.scala-lang:scala-actors-migration_2.11:1.1.0 | +--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 | +--- org.scala-lang:scala-actors:2.11.0 | | \--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 | \--- org.scala-lang.plugins:scala-continuations-library_2.11:1.0.1 -> 1.0.2_mc +--- org.scala-lang:scala-compiler:2.11.1 | +--- org.scala-lang:scala-library:2.11.1 | +--- org.scala-lang:scala-reflect:2.11.1 | | \--- org.scala-lang:scala-library:2.11.1 | +--- org.scala-lang.modules:scala-xml_2.11:1.0.2 | | \--- org.scala-lang:scala-library:2.11.1 | \--- org.scala-lang.modules:scala-parser-combinators_2.11:1.0.1 | \--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 +--- org.scala-lang.plugins:scala-continuations-library_2.11:1.0.2_mc +--- org.scala-lang.plugins:scala-continuations-plugin_2.11.1:1.0.2_mc +--- org.scala-lang:scala-library:2.11.1 +--- org.scala-lang:scala-parser-combinators_2.11:1.0.1 +--- org.scala-lang:scala-reflect:2.11.1 (*) +--- org.scala-lang:scala-swing_2.11:1.0.1 +--- org.scala-lang:scala-xml_2.11:1.0.2 +--- lzma:lzma:0.0.1 +--- java3d:vecmath:1.5.2 +--- net.sf.trove4j:trove4j:3.0.3 +--- org.apache.maven:maven-artifact:3.5.3 | +--- org.codehaus.plexus:plexus-utils:3.1.0 | \--- org.apache.commons:commons-lang3:3.5 +--- net.sf.jopt-simple:jopt-simple:5.0.3 +--- org.apache.logging.log4j:log4j-api:2.15.0 +--- org.apache.logging.log4j:log4j-core:2.15.0 (*) \--- net.minecraftforge:legacydev:0.2.3.+ -> 0.2.3.1 testCompileOnly - Compile only dependencies for source set 'test'. No dependencies testImplementation - Implementation only dependencies for source set 'test'. (n) No dependencies testRuntime - Runtime dependencies for source set 'test' (deprecated, use 'testRuntimeOnly' instead). \--- net.minecraftforge:forge:1.12.2-14.23.5.2864_mapped_snapshot_20171003-1.12 +--- net.minecraft:client:1.12.2 | +--- com.mojang:patchy:1.3.9 | +--- oshi-project:oshi-core:1.1 | +--- net.java.dev.jna:jna:4.4.0 | +--- net.java.dev.jna:platform:3.4.0 | +--- com.ibm.icu:icu4j-core-mojang:51.2 | +--- net.sf.jopt-simple:jopt-simple:5.0.3 -> 5.0.4 | +--- com.paulscode:codecjorbis:20101023 | +--- com.paulscode:codecwav:20101023 | +--- com.paulscode:libraryjavasound:20101123 | +--- com.paulscode:librarylwjglopenal:20100824 | +--- com.paulscode:soundsystem:20120107 | +--- io.netty:netty-all:4.1.9.Final | +--- com.google.guava:guava:21.0 | +--- org.apache.commons:commons-lang3:3.5 | +--- commons-io:commons-io:2.5 | +--- commons-codec:commons-codec:1.10 | +--- net.java.jinput:jinput:2.0.5 | | +--- net.java.jutils:jutils:1.0.0 | | \--- net.java.jinput:jinput-platform:2.0.5 | +--- net.java.jutils:jutils:1.0.0 | +--- com.google.code.gson:gson:2.8.0 | +--- com.mojang:authlib:1.5.25 | +--- com.mojang:realms:1.10.22 | +--- org.apache.commons:commons-compress:1.8.1 | +--- org.apache.httpcomponents:httpclient:4.3.3 | | +--- org.apache.httpcomponents:httpcore:4.3.2 | | +--- commons-logging:commons-logging:1.1.3 | | \--- commons-codec:commons-codec:1.6 -> 1.10 | +--- commons-logging:commons-logging:1.1.3 | +--- org.apache.httpcomponents:httpcore:4.3.2 | +--- it.unimi.dsi:fastutil:7.1.0 | +--- org.apache.logging.log4j:log4j-api:2.8.1 -> 2.15.0 | +--- org.apache.logging.log4j:log4j-core:2.8.1 -> 2.15.0 | | \--- org.apache.logging.log4j:log4j-api:2.15.0 | +--- org.lwjgl.lwjgl:lwjgl:2.9.4-nightly-20150209 | +--- org.lwjgl.lwjgl:lwjgl_util:2.9.4-nightly-20150209 | +--- org.lwjgl.lwjgl:lwjgl-platform:2.9.4-nightly-20150209 | +--- net.java.jinput:jinput-platform:2.0.5 | +--- com.mojang:text2speech:1.10.3 | \--- com.google.code.findbugs:jsr305:3.0.1 +--- com.google.code.findbugs:jsr305:3.0.1 +--- net.minecraftforge:mergetool:1.0.13 | +--- org.ow2.asm:asm:6.2 | +--- org.ow2.asm:asm-tree:6.2 | | \--- org.ow2.asm:asm:6.2 | +--- org.ow2.asm:asm-util:6.2 | | +--- org.ow2.asm:asm:6.2 | | +--- org.ow2.asm:asm-tree:6.2 (*) | | \--- org.ow2.asm:asm-analysis:6.2 | | \--- org.ow2.asm:asm-tree:6.2 (*) | \--- net.sf.jopt-simple:jopt-simple:5.0.4 +--- net.minecraft:mappings_snapshot:20171003-1.12 +--- org.ow2.asm:asm-debug-all:5.2 +--- net.minecraft:launchwrapper:1.12 +--- org.jline:jline:3.5.1 +--- com.typesafe.akka:akka-actor_2.11:2.3.3 | +--- org.scala-lang:scala-library:2.11.1 | \--- com.typesafe:config:1.2.1 +--- com.typesafe:config:1.2.1 +--- org.scala-lang:scala-actors-migration_2.11:1.1.0 | +--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 | +--- org.scala-lang:scala-actors:2.11.0 | | \--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 | \--- org.scala-lang.plugins:scala-continuations-library_2.11:1.0.1 -> 1.0.2_mc +--- org.scala-lang:scala-compiler:2.11.1 | +--- org.scala-lang:scala-library:2.11.1 | +--- org.scala-lang:scala-reflect:2.11.1 | | \--- org.scala-lang:scala-library:2.11.1 | +--- org.scala-lang.modules:scala-xml_2.11:1.0.2 | | \--- org.scala-lang:scala-library:2.11.1 | \--- org.scala-lang.modules:scala-parser-combinators_2.11:1.0.1 | \--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 +--- org.scala-lang.plugins:scala-continuations-library_2.11:1.0.2_mc +--- org.scala-lang.plugins:scala-continuations-plugin_2.11.1:1.0.2_mc +--- org.scala-lang:scala-library:2.11.1 +--- org.scala-lang:scala-parser-combinators_2.11:1.0.1 +--- org.scala-lang:scala-reflect:2.11.1 (*) +--- org.scala-lang:scala-swing_2.11:1.0.1 +--- org.scala-lang:scala-xml_2.11:1.0.2 +--- lzma:lzma:0.0.1 +--- java3d:vecmath:1.5.2 +--- net.sf.trove4j:trove4j:3.0.3 +--- org.apache.maven:maven-artifact:3.5.3 | +--- org.codehaus.plexus:plexus-utils:3.1.0 | \--- org.apache.commons:commons-lang3:3.5 +--- net.sf.jopt-simple:jopt-simple:5.0.3 -> 5.0.4 +--- org.apache.logging.log4j:log4j-api:2.15.0 +--- org.apache.logging.log4j:log4j-core:2.15.0 (*) \--- net.minecraftforge:legacydev:0.2.3.+ -> 0.2.3.1 testRuntimeClasspath - Runtime classpath of source set 'test'. \--- net.minecraftforge:forge:1.12.2-14.23.5.2864_mapped_snapshot_20171003-1.12 +--- net.minecraft:client:1.12.2 | +--- com.mojang:patchy:1.3.9 | +--- oshi-project:oshi-core:1.1 | +--- net.java.dev.jna:jna:4.4.0 | +--- net.java.dev.jna:platform:3.4.0 | +--- com.ibm.icu:icu4j-core-mojang:51.2 | +--- net.sf.jopt-simple:jopt-simple:5.0.3 -> 5.0.4 | +--- com.paulscode:codecjorbis:20101023 | +--- com.paulscode:codecwav:20101023 | +--- com.paulscode:libraryjavasound:20101123 | +--- com.paulscode:librarylwjglopenal:20100824 | +--- com.paulscode:soundsystem:20120107 | +--- io.netty:netty-all:4.1.9.Final | +--- com.google.guava:guava:21.0 | +--- org.apache.commons:commons-lang3:3.5 | +--- commons-io:commons-io:2.5 | +--- commons-codec:commons-codec:1.10 | +--- net.java.jinput:jinput:2.0.5 | | +--- net.java.jutils:jutils:1.0.0 | | \--- net.java.jinput:jinput-platform:2.0.5 | +--- net.java.jutils:jutils:1.0.0 | +--- com.google.code.gson:gson:2.8.0 | +--- com.mojang:authlib:1.5.25 | +--- com.mojang:realms:1.10.22 | +--- org.apache.commons:commons-compress:1.8.1 | +--- org.apache.httpcomponents:httpclient:4.3.3 | | +--- org.apache.httpcomponents:httpcore:4.3.2 | | +--- commons-logging:commons-logging:1.1.3 | | \--- commons-codec:commons-codec:1.6 -> 1.10 | +--- commons-logging:commons-logging:1.1.3 | +--- org.apache.httpcomponents:httpcore:4.3.2 | +--- it.unimi.dsi:fastutil:7.1.0 | +--- org.apache.logging.log4j:log4j-api:2.8.1 -> 2.15.0 | +--- org.apache.logging.log4j:log4j-core:2.8.1 -> 2.15.0 | | \--- org.apache.logging.log4j:log4j-api:2.15.0 | +--- org.lwjgl.lwjgl:lwjgl:2.9.4-nightly-20150209 | +--- org.lwjgl.lwjgl:lwjgl_util:2.9.4-nightly-20150209 | +--- org.lwjgl.lwjgl:lwjgl-platform:2.9.4-nightly-20150209 | +--- net.java.jinput:jinput-platform:2.0.5 | +--- com.mojang:text2speech:1.10.3 | \--- com.google.code.findbugs:jsr305:3.0.1 +--- com.google.code.findbugs:jsr305:3.0.1 +--- net.minecraftforge:mergetool:1.0.13 | +--- org.ow2.asm:asm:6.2 | +--- org.ow2.asm:asm-tree:6.2 | | \--- org.ow2.asm:asm:6.2 | +--- org.ow2.asm:asm-util:6.2 | | +--- org.ow2.asm:asm:6.2 | | +--- org.ow2.asm:asm-tree:6.2 (*) | | \--- org.ow2.asm:asm-analysis:6.2 | | \--- org.ow2.asm:asm-tree:6.2 (*) | \--- net.sf.jopt-simple:jopt-simple:5.0.4 +--- net.minecraft:mappings_snapshot:20171003-1.12 +--- org.ow2.asm:asm-debug-all:5.2 +--- net.minecraft:launchwrapper:1.12 +--- org.jline:jline:3.5.1 +--- com.typesafe.akka:akka-actor_2.11:2.3.3 | +--- org.scala-lang:scala-library:2.11.1 | \--- com.typesafe:config:1.2.1 +--- com.typesafe:config:1.2.1 +--- org.scala-lang:scala-actors-migration_2.11:1.1.0 | +--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 | +--- org.scala-lang:scala-actors:2.11.0 | | \--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 | \--- org.scala-lang.plugins:scala-continuations-library_2.11:1.0.1 -> 1.0.2_mc +--- org.scala-lang:scala-compiler:2.11.1 | +--- org.scala-lang:scala-library:2.11.1 | +--- org.scala-lang:scala-reflect:2.11.1 | | \--- org.scala-lang:scala-library:2.11.1 | +--- org.scala-lang.modules:scala-xml_2.11:1.0.2 | | \--- org.scala-lang:scala-library:2.11.1 | \--- org.scala-lang.modules:scala-parser-combinators_2.11:1.0.1 | \--- org.scala-lang:scala-library:2.11.0 -> 2.11.1 +--- org.scala-lang.plugins:scala-continuations-library_2.11:1.0.2_mc +--- org.scala-lang.plugins:scala-continuations-plugin_2.11.1:1.0.2_mc +--- org.scala-lang:scala-library:2.11.1 +--- org.scala-lang:scala-parser-combinators_2.11:1.0.1 +--- org.scala-lang:scala-reflect:2.11.1 (*) +--- org.scala-lang:scala-swing_2.11:1.0.1 +--- org.scala-lang:scala-xml_2.11:1.0.2 +--- lzma:lzma:0.0.1 +--- java3d:vecmath:1.5.2 +--- net.sf.trove4j:trove4j:3.0.3 +--- org.apache.maven:maven-artifact:3.5.3 | +--- org.codehaus.plexus:plexus-utils:3.1.0 | \--- org.apache.commons:commons-lang3:3.5 +--- net.sf.jopt-simple:jopt-simple:5.0.3 -> 5.0.4 +--- org.apache.logging.log4j:log4j-api:2.15.0 +--- org.apache.logging.log4j:log4j-core:2.15.0 (*) \--- net.minecraftforge:legacydev:0.2.3.+ -> 0.2.3.1 testRuntimeOnly - Runtime only dependencies for source set 'test'. (n) No dependencies (*) - dependencies omitted (listed previously) A web-based, searchable dependency report is available by adding the --scan option. BUILD SUCCESSFUL in 8s 1 actionable task: 1 executed
最新发布
12-07
C:\Program Files\nginx-1.22.1>nginx-service.exe install log4net:ERROR Exception while reading ConfigurationSettings. Check your .config file is well formed XML. System.TypeInitializationException: The type initializer for 'log4net.Util.Syste mInfo' threw an exception. ---> System.TypeInitializationException: The type initializer for 'System.DateT ime' threw an exception. ---> System.ArgumentNullException: Value cannot be null. (Parameter 'handle') at System.Runtime.InteropServices.NativeLibrary.GetExport(IntPtr , String ) at System.DateTime.GetGetSystemTimeAsFileTimeFnPtr() at System.DateTime..cctor() --- End of inner exception stack trace --- at System.DateTime.get_UtcNow() at log4net.Util.SystemInfo..cctor() --- End of inner exception stack trace --- at log4net.Util.SystemInfo.GetAppSetting(String key) at log4net.Util.LogLog..cctor() Unhandled exception. System.TypeInitializationException: The type initializer fo r 'WinSW.Program' threw an exception. ---> System.TypeInitializationException: The type initializer for 'log4net.Core .LoggerManager' threw an exception. ---> System.TypeInitializationException: The type initializer for 'log4net.Util .SystemInfo' threw an exception. ---> System.TypeInitializationException: The type initializer for 'System.DateT ime' threw an exception. ---> System.ArgumentNullException: Value cannot be null. (Parameter 'handle') at System.Runtime.InteropServices.NativeLibrary.GetExport(IntPtr , String ) at System.DateTime.GetGetSystemTimeAsFileTimeFnPtr() at System.DateTime..cctor() --- End of inner exception stack trace --- at System.DateTime.get_UtcNow() at log4net.Util.SystemInfo..cctor() --- End of inner exception stack trace --- at log4net.Util.SystemInfo.AssemblyLocationInfo(Assembly myAssembly) at log4net.Core.LoggerManager.GetVersionInfo() at log4net.Core.LoggerManager..cctor() --- End of inner exception stack trace --- at log4net.Core.LoggerManager.GetLogger(Ass
08-19
<think>好的,我需要解决用户关于MyBatis配置文件mybatis-config.xml路径和内容的疑问。用户提到“classpath:mybatis/mybatis-config.xml”,所以首先得明确classpath在项目中的位置。首先,classpath通常指项目编译后的资源目录,比如在Maven项目中,src/main/resources目录下的文件会直接放在classpath根目录下。如果用户配置的是classpath:mybatis/mybatis-config.xml,那这个文件应该位于resources/mybatis目录下。需要确认用户的项目结构是否正确,比如是否在正确的位置创建了mybatis文件夹,并将配置文件放入其中。接下来,关于配置文件的内容,用户提供的引用中提到了mybatis-config.xml的基本结构,比如environments配置数据源、事务管理,以及mappers指定映射文件的位置。需要把这些内容整理出来,说明各个部分的作用,比如settings中的日志配置,typeAliases别名处理等。用户可能遇到的问题是配置文件路径错误导致MyBatis无法加载,或者配置内容有误导致连接数据库失败。需要给出典型的配置示例,并指出常见配置项,如数据库驱动、URL、用户名密码,以及日志输出的设置方法,如使用STDOUT_LOGGING来在控制台打印SQL日志。另外,用户之前的问题是关于SQL日志的配置,所以需要确保在当前的回答中提到的日志配置部分与之前的指引一致,比如引用中的settingname="logImpl"value="STDOUT_LOGGING",这对应之前提到的MyBatis原生配置方法。可能需要强调在mybatis-config.xml中设置这个选项,而不是在application.yml中,取决于用户使用的是纯MyBatis还是整合了Spring Boot。 最后,生成相关问题时要围绕配置文件的路径、内容、常见配置错误以及与其他框架整合时的注意事项,帮助用户扩展可能遇到的其他问题。</think>### MyBatis配置文件`mybatis-config.xml`路径及内容解析 --- #### 一、配置文件路径说明 `classpath:mybatis/mybatis-config.xml`表示该配置文件位于**项目的资源目录(classpath)下的`mybatis`文件夹中**。具体路径取决于项目结构: 1. **Maven/Gradle项目**: - 标准资源目录:`src/main/resources/mybatis/mybatis-config.xml` - 编译后路径:`target/classes/mybatis/mybatis-config.xml`(Maven)或`build/resources/main/mybatis/mybatis-config.xml`(Gradle)[^1] 2. **非Maven项目**: - 需确保`mybatis-config.xml`位于加载器可识别的资源路径中,例如`WEB-INF/classes/mybatis/` --- #### 二、配置文件核心内容 以下为典型的`mybatis-config.xml`结构(包含事务管理、数据源、日志配置等): ```xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 全局参数设置 --> <settings> <!-- 开启日志输出(控制台打印SQL) --> <setting name="logImpl" value="STDOUT_LOGGING"/> <!-- 开启驼峰命名映射 --> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <!-- 数据源配置 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test_db"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!-- 映射文件配置 --> <mappers> <mapper resource="mybatis/UserMapper.xml"/> </mappers> </configuration> ``` **关键配置项说明**: 1. **`<settings>`**:定义全局行为,如日志实现、缓存策略等[^4] 2. **`<environments>`**:配置数据库连接池和事务管理器[^2] 3. **`<mappers>`**:指定Mapper XML文件路径(支持`resource`、`class`、`package`等方式)[^1] --- #### 三、常见问题排查 1. **配置文件未找到**: - 检查文件是否位于`resources/mybatis`目录 - 确认Maven的`pom.xml`中是否包含资源声明: ```xml <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> ``` 2. **配置未生效**: - 确认MyBatis初始化时正确加载了配置文件(如`SqlSessionFactoryBuilder`的输入流路径) - 若整合Spring Boot,需在`application.yml`中指定配置文件路径: ```yaml mybatis: config-location: classpath:mybatis/mybatis-config.xml ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值