Commons Pool Source Code Analysis in 2009

本文详细解析了Apache Commons Pool中的对象池设计原理及其实现细节,包括StackObjectPool和ReferenceObjectPool等。探讨了对象池的适用场景及其设计重点,同时提供了具体的接口设计和实现代码。

@Author: cjcj  cj.yangjun@gmail.com <c-j.iteye.com>

对象池(对Apache Commons部分源码分析)

1,commons pool中的StatckObjectPool 和 ReferenceObjectPool等 本身设计的确实不允许"脏"对象的外围的activate(), passivate()充当了"清理"工作..
2,如果pool的_maxSleeping阀值设置不当的话,在多线程APP下确实会导致堵塞...上限阀值和下限阀值很重要吧...
3,另外commons提供了一个ReferenceObjectPool,这种的好处在于内存不足时,GC无条件回收pool中的空闲对象,.这样资源可适当得到利用..不过pool中总要有一定量的闲对象,不可能每次都new吧。
4,commons中,是borrow()时,如果pool中没有空闲obj的时候,就创建新的obj,当然这个新对象是无状态的,所以建立在pool存储也需要建立在"无状态对象"的基本之上...  

 

什么时候不要池化?

    采用对象池化的本意,是要通过减少对象生成的次数,减少花在对象初始化上面的开销,然而池化处理本身也要付出代价,因此,并非任何情况下都适合采用对象池化。
    Dr. Cliff Click在JavaOne 2003上发表的《Performance Myths Exposed》中测试表明:

1#类似Point这样的轻量级对象,进行池化处理后,性能反而下降.

2#类似Point这样的轻量级对象,进行池化处理后,性能反而下降.

3#类似JPanel\Connection这样的重量级对象,进行池化处理后,性能有所上升,可以考虑池化。

 
Commons的几个功能方面:

1,pool的每个进出object都进行类型检查
2,提供了一个线程安全的版本.
3,对当前active object和sleeping object的控制
4,对object的获取和释放的时间控制
5,容错处理

 

设计结构:

 1,PoolableObjectFactory用于管理被池化的对象的产生、激活、挂起、校验和销毁;
 2,ObjectPool用于管理要被池化的对象的借出和归还,并通知PoolableObjectFactory完成相应的工作;

 

设计重点:


 1,池用某个容器存储对象(如Stack,List等)。
 2,池中的每个对象是“干净”对象,或者说每一个从池中读取的对象都是一样初始化的对象(可取个别名为“裸对象”)。
 3,对象-->裸对象 由外围的Factory来处理。
 4,接口方式为:ObjectPool --> BaseObjectPool -->StackObjectPool
 

 

接口设计代码(对原设计有做简化):

清单:

以下是CommonsPool的接口,也就是最抽象的一层;

1、ObjectPool.java(pool的基本接口)

2、PoolableObjectFactory.java(Factory的基本接口)

#######################ObjectPool.java###############
package pools.inter;

import java.util.NoSuchElementException;

import pools.impl.pool.BaseObjectPool;

/**
 * A pooling interface.
 *  
 *
 * @author Rodney Waldhoff
 * @author Sandy McArthur
 * @since Pool 1.0
 */
public interface ObjectPool {
    // 从池中拿裸对象
    Object borrowObject() throws Exception, NoSuchElementException, IllegalStateException;

    // 返回给池
    void returnObject(Object obj) throws Exception;

    // 销毁对象,需要Factory(因为设计Factory就是负责对象处理等) 
    void invalidateObject(Object obj) throws Exception;

    // 利用Factory创建一个新对象      
    void addObject() throws Exception, IllegalStateException, UnsupportedOperationException;

    // 获得池中对象个数 
    int getNumIdle() throws UnsupportedOperationException;

    // 获取池外活动的对象个数   
    int getNumActive() throws UnsupportedOperationException;

    // 清空池中对象,就是把所有对象丢给Factory来销毁   
    void clear() throws Exception, UnsupportedOperationException;

    // 关闭池,但不销毁对象   
    void close() throws Exception;
   
    void setFactory(PoolableObjectFactory factory) throws IllegalStateException, UnsupportedOperationException;
}

  

 

 

 

#######################PoolableObjectFactory.java###############

 

public interface PoolableObjectFactory {
  
  Object makeObject() throws Exception;

  
  void destroyObject(Object obj) throws Exception;

  boolean validateObject(Object obj);

 
  void activateObject(Object obj) throws Exception;

  
  void passivateObject(Object obj) throws Exception;
}

 

 

 

实现设计:

清单:

 

1\BaseObjectPool.java

2\SoftReferenceObjectPool.java

3\StackObjectPool.java

 

以下是一个抽象类而已,关联的是上面的那个接口,注释同上

######################BaseObjectPool.java#################

public abstract class BaseObjectPool implements ObjectPool {
    public abstract Object borrowObject() throws Exception;
    
    public abstract void returnObject(Object obj) throws Exception;
    
    public abstract void invalidateObject(Object obj) throws Exception;

    public int getNumIdle() throws UnsupportedOperationException {
        return -1;
    }

    public int getNumActive() throws UnsupportedOperationException {
        return -1;
    }

    public void clear() throws Exception, UnsupportedOperationException {
        throw new UnsupportedOperationException();
    }

    public void addObject() throws Exception, UnsupportedOperationException {
        throw new UnsupportedOperationException();
    }

    public void close() throws Exception {
        closed = true;
    }

    public void setFactory(PoolableObjectFactory factory) throws IllegalStateException, UnsupportedOperationException {
        throw new UnsupportedOperationException();
    }

    protected final boolean isClosed() {
        return closed;
    }
    protected final void assertOpen() throws IllegalStateException {
        if (isClosed()) {
            throw new IllegalStateException("Pool not open");
        }
    }

    /** Whether or not the pool is closed */
    private volatile boolean closed = false;
}

 

 

 

 

######################SoftReferenceObjectPool.java#############

一个弱引用对象池的实现类,这个对象池的特点是内存不足时,GC无条件回收池中的对象.

 

public class SoftReferenceObjectPool extends BaseObjectPool implements ObjectPool {
    public static int DEFAULT_INIT_SLEEPING_CAPACITY;

	public static int DEFAULT_MAX_SLEEPING;

    public SoftReferenceObjectPool() {
        _pool = new ArrayList(); // 能看出来,池中的对象是用List数据结构来存储的
        _factory = null;
    }

    public SoftReferenceObjectPool(PoolableObjectFactory factory) {
        _pool = new ArrayList();
        _factory = factory;
    }


    public SoftReferenceObjectPool(PoolableObjectFactory _factory2,
			int sleeping, int capacity) {
		// TODO Auto-generated constructor stub
	}

	public synchronized Object borrowObject() throws Exception {
        assertOpen();
        Object obj = null;
        boolean newlyCreated = false;
        while(null == obj) {
            if(_pool.isEmpty()) {
                if(null == _factory) {
                    throw new NoSuchElementException();
                } else {
                    newlyCreated = true;
                    obj = _factory.makeObject();
                }
            } else {
                SoftReference ref = (SoftReference)(_pool.remove(_pool.size() - 1));
                obj = ref.get();
                ref.clear(); // prevent this ref from being enqueued with refQueue.
            }
            if (null != _factory && null != obj) {
                try {
                    _factory.activateObject(obj);
                    if (!_factory.validateObject(obj)) {
                        throw new Exception("ValidateObject failed");
                    }
                } catch (Throwable t) {
                    try {
                        _factory.destroyObject(obj);
                    } catch (Throwable t2) {
                        // swallowed
                    } finally {
                        obj = null;
                    }
                    if (newlyCreated) {
                        throw new NoSuchElementException(
                            "Could not create a validated object, cause: " +
                            t.getMessage());
                    }
                }
            }
        }
        _numActive++;
        return obj;
    }

    public synchronized void returnObject(Object obj) throws Exception {
        boolean success = !isClosed();
        if (_factory != null) {
            if(!_factory.validateObject(obj)) {
                success = false;
            } else {
                try {
                    _factory.passivateObject(obj);
                } catch(Exception e) {
                    success = false;
                }
            }
        }

        boolean shouldDestroy = !success;
        _numActive--;
        if(success) {
            _pool.add(new SoftReference(obj, refQueue));
        }
        notifyAll(); // _numActive has changed

        if (shouldDestroy && _factory != null) {
            try {
                _factory.destroyObject(obj);
            } catch(Exception e) {
                // ignored
            }
        }
    }

    public synchronized void invalidateObject(Object obj) throws Exception {
        _numActive--;
        if (_factory != null) {
            _factory.destroyObject(obj);
        }
        notifyAll(); // _numActive has changed
    }

    /**
     * Create an object, and place it into the pool.
     * addObject() is useful for "pre-loading" a pool with idle objects.
     */
    public synchronized void addObject() throws Exception {
        assertOpen();
        if (_factory == null) {
            throw new IllegalStateException("Cannot add objects without a factory.");
        }
        Object obj = _factory.makeObject();

        boolean success = true;
        if(!_factory.validateObject(obj)) {
            success = false;
        } else {
            _factory.passivateObject(obj);
        }

        boolean shouldDestroy = !success;
        if(success) {
            _pool.add(new SoftReference(obj, refQueue));
            notifyAll(); // _numActive has changed
        }

        if(shouldDestroy) {
            try {
                _factory.destroyObject(obj);
            } catch(Exception e) {
                // ignored
            }
        }
    }

    /** Returns an approximation not less than the of the number of idle instances in the pool. */
    public synchronized int getNumIdle() {
        pruneClearedReferences();
        return _pool.size();
    }

    public synchronized int getNumActive() {
        return _numActive;
    }

    /**
     * Clears any objects sitting idle in the pool.
     */
    public synchronized void clear() {
        if(null != _factory) {
            Iterator iter = _pool.iterator();
            while(iter.hasNext()) {
                try {
                    Object obj = ((SoftReference)iter.next()).get();
                    if(null != obj) {
                        _factory.destroyObject(obj);
                    }
                } catch(Exception e) {
                    // ignore error, keep destroying the rest
                }
            }
        }
        _pool.clear();
        pruneClearedReferences();
    }

    public void close() throws Exception {
        super.close();
        clear();
    }

    public synchronized void setFactory(PoolableObjectFactory factory) throws IllegalStateException {
        assertOpen();
        if(0 < getNumActive()) {
            throw new IllegalStateException("Objects are already active");
        } else {
            clear();
            _factory = factory;
        }
    }

    private void pruneClearedReferences() {
        Reference ref;
        while ((ref = refQueue.poll()) != null) {
            try {
                _pool.remove(ref);
            } catch (UnsupportedOperationException uoe) {
                // ignored
            }
        }
    }

    /** My pool. */
    private List _pool = null;

    /** My {@link PoolableObjectFactory}. */
    private PoolableObjectFactory _factory = null;

    private final ReferenceQueue refQueue = new ReferenceQueue();

    /** Number of active objects. */
    private int _numActive = 0;
}

 

 

 

########################StackObjectPool.java#############

以下是一个Stack容器的对象池

 

public class StackObjectPool extends BaseObjectPool implements ObjectPool {
    public StackObjectPool() {
        this((PoolableObjectFactory)null,DEFAULT_MAX_SLEEPING,DEFAULT_INIT_SLEEPING_CAPACITY);
    }
    public StackObjectPool(int maxIdle) {
        this((PoolableObjectFactory)null,maxIdle,DEFAULT_INIT_SLEEPING_CAPACITY);
    }

    public StackObjectPool(int maxIdle, int initIdleCapacity) {
        this((PoolableObjectFactory)null,maxIdle,initIdleCapacity);
    }
    public StackObjectPool(PoolableObjectFactory factory) {
        this(factory,DEFAULT_MAX_SLEEPING,DEFAULT_INIT_SLEEPING_CAPACITY);
    }

    public StackObjectPool(PoolableObjectFactory factory, int maxIdle) {
        this(factory,maxIdle,DEFAULT_INIT_SLEEPING_CAPACITY);
    }

    public StackObjectPool(PoolableObjectFactory factory, int maxIdle, int initIdleCapacity) {
        _factory = factory;
        _maxSleeping = (maxIdle < 0 ? DEFAULT_MAX_SLEEPING : maxIdle);
        int initcapacity = (initIdleCapacity < 1 ? DEFAULT_INIT_SLEEPING_CAPACITY : initIdleCapacity);
        _pool = new Stack();
        _pool.ensureCapacity( initcapacity > _maxSleeping ? _maxSleeping : initcapacity);
    }

    public synchronized Object borrowObject() throws Exception {
        assertOpen();
        Object obj = null;
        boolean newlyCreated = false;
    
        
        while (null == obj) {
            if (!_pool.empty()) {
                obj = _pool.pop();
            } else {
                if(null == _factory) {
                    throw new NoSuchElementException();
                } else {
                    obj = _factory.makeObject();
                    newlyCreated = true;
                  if (obj == null) {
                    throw new NoSuchElementException("PoolableObjectFactory.makeObject() returned null.");
                  }
                }
            }
            if (null != _factory && null != obj) {
                try {
                    _factory.activateObject(obj);
                    if (!_factory.validateObject(obj)) {
                        throw new Exception("ValidateObject failed");
                    }
                } catch (Throwable t) {
                    try {
                        _factory.destroyObject(obj);
                    } catch (Throwable t2) {
                        // swallowed
                    } finally {
                        obj = null;
                    }
                    if (newlyCreated) {
                        throw new NoSuchElementException(
                            "Could not create a validated object, cause: " +
                            t.getMessage());
                    }
                }
            }
        }
        
      
        
        _numActive++;
        return obj;
    }

    public synchronized void returnObject(Object obj) throws Exception {
        boolean success = !isClosed();
        if(null != _factory) {
            if(!_factory.validateObject(obj)) {
                success = false;
            } else {
                try {
                    _factory.passivateObject(obj);
                } catch(Exception e) {
                    success = false;
                }
            }
        }

        boolean shouldDestroy = !success;

        _numActive--;
        if (success) {
            Object toBeDestroyed = null;
            if(_pool.size() >= _maxSleeping) {
                shouldDestroy = true;
                toBeDestroyed = _pool.remove(0); // remove the stalest object
            }
            _pool.push(obj);
            obj = toBeDestroyed; // swap returned obj with the stalest one so it can be destroyed
        }
        notifyAll(); // _numActive has changed

        if(shouldDestroy) { // by constructor, shouldDestroy is false when _factory is null
            try {
                _factory.destroyObject(obj);
            } catch(Exception e) {
                // ignored
            }
        }
    }

    public synchronized void invalidateObject(Object obj) throws Exception {
        _numActive--;
        if (null != _factory) {
            _factory.destroyObject(obj);
        }
        notifyAll(); // _numActive has changed
    }

    public synchronized int getNumIdle() {
        return _pool.size();
    }

    public synchronized int getNumActive() {
        return _numActive;
    }

    /**
     * Clears any objects sitting idle in the pool.
     */
    public synchronized void clear() {
        if(null != _factory) {
            Iterator it = _pool.iterator();
            while(it.hasNext()) {
                try {
                    _factory.destroyObject(it.next());
                } catch(Exception e) {
                    // ignore error, keep destroying the rest
                }
            }
        }
        _pool.clear();
    }

    public void close() throws Exception {
        super.close();
        clear();
    }

    public synchronized void addObject() throws Exception {
        assertOpen();
        if (_factory == null) {
            throw new IllegalStateException("Cannot add objects without a factory.");
        }
        Object obj = _factory.makeObject();

        boolean success = true;
        if(!_factory.validateObject(obj)) {
            success = false;
        } else {
            _factory.passivateObject(obj);
        }

        boolean shouldDestroy = !success;

        if (success) {
            Object toBeDestroyed = null;
            if(_pool.size() >= _maxSleeping) {
                shouldDestroy = true;
                toBeDestroyed = _pool.remove(0); // remove the stalest object
            }
            _pool.push(obj);
            obj = toBeDestroyed; // swap returned obj with the stalest one so it can be destroyed
        }
        notifyAll(); // _numIdle has changed

        if(shouldDestroy) { // by constructor, shouldDestroy is false when _factory is null
            try {
                _factory.destroyObject(obj);
            } catch(Exception e) {
                // ignored
            }
        }
    }

    public synchronized void setFactory(PoolableObjectFactory factory) throws IllegalStateException {
        assertOpen();
        if(0 < getNumActive()) {
            throw new IllegalStateException("Objects are already active");
        } else {
            clear();
            _factory = factory;
        }
    }

    /** The default cap on the number of "sleeping" instances in the pool. */
    public static final int DEFAULT_MAX_SLEEPING  = 8;

    public static final int DEFAULT_INIT_SLEEPING_CAPACITY = 4;

    /** My pool. */
    protected Stack _pool = null;

    /** My {@link PoolableObjectFactory}. */
    protected PoolableObjectFactory _factory = null;

    /** The cap on the number of "sleeping" instances in the pool. */
    protected int _maxSleeping = DEFAULT_MAX_SLEEPING;

    /** Number of object borrowed but not yet returned to the pool. */
    protected int _numActive = 0;
}

 

 

 

工厂实现代码:

清单:

1、BasePoolableObjectFactory.java

2\SoftReferencePoolFactory.java

3\StackObjectPoolFactory.java

#############################BasePoolableObjectFactory.java##########

public abstract class BasePoolableObjectFactory implements PoolableObjectFactory {
    public abstract Object makeObject()
        throws Exception;

    /** No-op. */
    public void destroyObject(Object obj)
        throws Exception  {
    }

    /**
     * This implementation always returns <tt>true</tt>.
     * @return <tt>true</tt>
     */
    public boolean validateObject(Object obj) {
        return true;
    }

    /** No-op. */
    public void activateObject(Object obj)
        throws Exception {
    }

    /** No-op. */
    public void passivateObject(Object obj)
        throws Exception {
    }
}

 

 

 

#########################SoftReferencePoolFactory.java###########

public class SoftReferencePoolFactory implements PoolableObjectFactory {
    /**
     * Create a new StackObjectPoolFactory.
     *
     * @see StackObjectPool#StackObjectPool()
     */
    public SoftReferencePoolFactory() {
        this((PoolableObjectFactory)null,StackObjectPool.DEFAULT_MAX_SLEEPING,StackObjectPool.DEFAULT_INIT_SLEEPING_CAPACITY);
    }

    /**
     * Create a new StackObjectPoolFactory.
     *
     * @param maxIdle cap on the number of "sleeping" instances in the pool.
     * @see StackObjectPool#StackObjectPool(int)
     */
    public SoftReferencePoolFactory(int maxIdle) {
        this((PoolableObjectFactory)null,maxIdle,StackObjectPool.DEFAULT_INIT_SLEEPING_CAPACITY);
    }

    /**
     * Create a new StackObjectPoolFactory.
     *
     * @param maxIdle cap on the number of "sleeping" instances in the pool.
     * @param initIdleCapacity - initial size of the pool (this specifies the size of the container, it does not cause the pool to be pre-populated.)
     * @see StackObjectPool#StackObjectPool(int, int)
     */
    public SoftReferencePoolFactory(int maxIdle, int initIdleCapacity) {
        this((PoolableObjectFactory)null,maxIdle,initIdleCapacity);
    }

    /**
     * Create a new StackObjectPoolFactory.
     *
     * @param factory the PoolableObjectFactory used by created pools.
     * @see StackObjectPool#StackObjectPool(PoolableObjectFactory)
     */
    public SoftReferencePoolFactory(PoolableObjectFactory factory) {
        this(factory,StackObjectPool.DEFAULT_MAX_SLEEPING,StackObjectPool.DEFAULT_INIT_SLEEPING_CAPACITY);
    }

    /**
     * Create a new StackObjectPoolFactory.
     *
     * @param factory the PoolableObjectFactory used by created pools.
     * @param maxIdle cap on the number of "sleeping" instances in the pool.
     */
    public SoftReferencePoolFactory(PoolableObjectFactory factory, int maxIdle) {
        this(factory,maxIdle,SoftReferenceObjectPool.DEFAULT_INIT_SLEEPING_CAPACITY);
    }

    /**
     * Create a new StackObjectPoolFactory.
     *
     * @param factory the PoolableObjectFactory used by created pools.
     * @param maxIdle cap on the number of "sleeping" instances in the pool.
     * @param initIdleCapacity - initial size of the pool (this specifies the size of the container, it does not cause the pool to be pre-populated.)
     */
    public SoftReferencePoolFactory(PoolableObjectFactory factory, int maxIdle, int initIdleCapacity) {
        _factory = factory;
        _maxSleeping = maxIdle;
        _initCapacity = initIdleCapacity;
    }

    public ObjectPool createPool() {
        return new SoftReferenceObjectPool(_factory,_maxSleeping,_initCapacity);
    }

    protected PoolableObjectFactory _factory = null;
    protected int _maxSleeping = SoftReferenceObjectPool.DEFAULT_MAX_SLEEPING;
    protected int _initCapacity = SoftReferenceObjectPool.DEFAULT_INIT_SLEEPING_CAPACITY;
	public void activateObject(Object obj) throws Exception {
		// TODO Auto-generated method stub
		
	}

	public void destroyObject(Object obj) throws Exception {
		// TODO Auto-generated method stub
		
	}

	public Object makeObject() throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

	public void passivateObject(Object obj) throws Exception {
		// TODO Auto-generated method stub
		
	}

	public boolean validateObject(Object obj) {
		// TODO Auto-generated method stub
		return false;
	}

}

 

 

 

 附加实例:

另一人写的简单objectpool

package com.thoughtworks.xstream.core.util;

/**
 * A simple pool implementation.
 *
 * @author J&ouml;rg Schaible
 * @author Joe Walnes
 */
public class Pool {
    
    public interface Factory {
        public Object newInstance();
    }

    private final int initialPoolSize;
    private final int maxPoolSize;
    private final Factory factory;
    private transient Object[] pool;
    private transient int nextAvailable;
    private transient Object mutex = new Object();

    public Pool(int initialPoolSize, int maxPoolSize, Factory factory) {
        this.initialPoolSize = initialPoolSize;
        this.maxPoolSize = maxPoolSize;
        this.factory = factory;
    }

    public Object fetchFromPool() {
        Object result;
        synchronized (mutex) {
            if (pool == null) {
                pool = new Object[maxPoolSize];
                for (nextAvailable = initialPoolSize; nextAvailable > 0; ) {
                    putInPool(factory.newInstance());
                }
            }
            while (nextAvailable == maxPoolSize) {
                try {
                    mutex.wait();
                } catch (InterruptedException e) {
                    throw new RuntimeException("Interrupted whilst waiting " +
                            "for a free item in the pool : " + e.getMessage());
                }
            }
            result = pool[nextAvailable++];
            if (result == null) {
                result = factory.newInstance();
                putInPool(result);
                ++nextAvailable;
            }
        }
        return result;
    }

    protected void putInPool(Object object) {
        synchronized (mutex) {
            pool[--nextAvailable] = object;
            mutex.notify();
        }
    }
    
    private Object readResolve() {
        mutex = new Object();
        return this;
    }
}

 

 

Command: D:\JAVA\bin\java.exe -Xmx9859m -Dfile.encoding=GB18030 -Dsun.stdout.encoding=GB18030 -Dsun.stderr.encoding=GB18030 -Djava.rmi.server.useCodebaseOnly=true -Dcom.sun.jndi.rmi.object.trustURLCodebase=false -Dcom.sun.jndi.cosnaming.object.trustURLCodebase=false -Dlog4j2.formatMsgNoLookups=true -Dlog4j.configurationFile=D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\log4j2.xml -Dminecraft.client.jar=D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\机械动力-1.20.1-[Forge].jar -Djava.net.useSystemProxiestrue -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+UseG1GC -XX:G1MixedGCCountTarget=5 -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32m -XX:-OmitStackTraceInFastThrow -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:TieredCompileTaskTimeout=10000 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NmethodSweepActivity=1 -Dfml.ignoreInvalidMinecraftCertificates=true -Dfml.ignorePatchDiscrepancies=true -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump -Djava.library.path=D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\natives-windows-x86_64 -Djna.tmpdir=D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\natives-windows-x86_64 -Dorg.lwjgl.system.SharedLibraryExtractPath=D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\natives-windows-x86_64 -Dio.netty.native.workdir=D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\natives-windows-x86_64 -Dminecraft.launcher.brand=HMCL -Dminecraft.launcher.version=3.7.5 -cp D:\MC\.minecraft\libraries\cpw\mods\securejarhandler\2.1.10\securejarhandler-2.1.10.jar;D:\MC\.minecraft\libraries\org\ow2\asm\asm\9.5\asm-9.5.jar;D:\MC\.minecraft\libraries\org\ow2\asm\asm-commons\9.5\asm-commons-9.5.jar;D:\MC\.minecraft\libraries\org\ow2\asm\asm-tree\9.5\asm-tree-9.5.jar;D:\MC\.minecraft\libraries\org\ow2\asm\asm-util\9.5\asm-util-9.5.jar;D:\MC\.minecraft\libraries\org\ow2\asm\asm-analysis\9.5\asm-analysis-9.5.jar;D:\MC\.minecraft\libraries\net\minecraftforge\accesstransformers\8.0.4\accesstransformers-8.0.4.jar;D:\MC\.minecraft\libraries\org\antlr\antlr4-runtime\4.9.1\antlr4-runtime-4.9.1.jar;D:\MC\.minecraft\libraries\net\minecraftforge\eventbus\6.0.5\eventbus-6.0.5.jar;D:\MC\.minecraft\libraries\net\minecraftforge\forgespi\7.0.1\forgespi-7.0.1.jar;D:\MC\.minecraft\libraries\net\minecraftforge\coremods\5.0.1\coremods-5.0.1.jar;D:\MC\.minecraft\libraries\cpw\mods\modlauncher\10.0.9\modlauncher-10.0.9.jar;D:\MC\.minecraft\libraries\net\minecraftforge\unsafe\0.2.0\unsafe-0.2.0.jar;D:\MC\.minecraft\libraries\net\minecraftforge\mergetool\1.1.5\mergetool-1.1.5-api.jar;D:\MC\.minecraft\libraries\com\electronwill\night-config\core\3.6.4\core-3.6.4.jar;D:\MC\.minecraft\libraries\com\electronwill\night-config\toml\3.6.4\toml-3.6.4.jar;D:\MC\.minecraft\libraries\org\apache\maven\maven-artifact\3.8.5\maven-artifact-3.8.5.jar;D:\MC\.minecraft\libraries\net\jodah\typetools\0.6.3\typetools-0.6.3.jar;D:\MC\.minecraft\libraries\net\minecrell\terminalconsoleappender\1.2.0\terminalconsoleappender-1.2.0.jar;D:\MC\.minecraft\libraries\org\jline\jline-reader\3.12.1\jline-reader-3.12.1.jar;D:\MC\.minecraft\libraries\org\jline\jline-terminal\3.12.1\jline-terminal-3.12.1.jar;D:\MC\.minecraft\libraries\org\spongepowered\mixin\0.8.5\mixin-0.8.5.jar;D:\MC\.minecraft\libraries\org\openjdk\nashorn\nashorn-core\15.3\nashorn-core-15.3.jar;D:\MC\.minecraft\libraries\net\minecraftforge\JarJarSelector\0.3.19\JarJarSelector-0.3.19.jar;D:\MC\.minecraft\libraries\net\minecraftforge\JarJarMetadata\0.3.19\JarJarMetadata-0.3.19.jar;D:\MC\.minecraft\libraries\cpw\mods\bootstraplauncher\1.1.2\bootstraplauncher-1.1.2.jar;D:\MC\.minecraft\libraries\net\minecraftforge\JarJarFileSystems\0.3.19\JarJarFileSystems-0.3.19.jar;D:\MC\.minecraft\libraries\net\minecraftforge\fmlloader\1.20.1-47.2.19\fmlloader-1.20.1-47.2.19.jar;D:\MC\.minecraft\libraries\net\minecraftforge\fmlearlydisplay\1.20.1-47.2.19\fmlearlydisplay-1.20.1-47.2.19.jar;D:\MC\.minecraft\libraries\com\github\oshi\oshi-core\6.2.2\oshi-core-6.2.2.jar;D:\MC\.minecraft\libraries\com\google\code\gson\gson\2.10\gson-2.10.jar;D:\MC\.minecraft\libraries\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1.jar;D:\MC\.minecraft\libraries\com\google\guava\guava\31.1-jre\guava-31.1-jre.jar;D:\MC\.minecraft\libraries\com\ibm\icu\icu4j\71.1\icu4j-71.1.jar;D:\MC\.minecraft\libraries\com\mojang\authlib\4.0.43\authlib-4.0.43.jar;D:\MC\.minecraft\libraries\com\mojang\blocklist\1.0.10\blocklist-1.0.10.jar;D:\MC\.minecraft\libraries\com\mojang\brigadier\1.1.8\brigadier-1.1.8.jar;D:\MC\.minecraft\libraries\com\mojang\datafixerupper\6.0.8\datafixerupper-6.0.8.jar;D:\MC\.minecraft\libraries\com\mojang\logging\1.1.1\logging-1.1.1.jar;D:\MC\.minecraft\libraries\com\mojang\patchy\2.2.10\patchy-2.2.10.jar;D:\MC\.minecraft\libraries\com\mojang\text2speech\1.17.9\text2speech-1.17.9.jar;D:\MC\.minecraft\libraries\commons-codec\commons-codec\1.15\commons-codec-1.15.jar;D:\MC\.minecraft\libraries\commons-io\commons-io\2.11.0\commons-io-2.11.0.jar;D:\MC\.minecraft\libraries\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;D:\MC\.minecraft\libraries\io\netty\netty-buffer\4.1.82.Final\netty-buffer-4.1.82.Final.jar;D:\MC\.minecraft\libraries\io\netty\netty-codec\4.1.82.Final\netty-codec-4.1.82.Final.jar;D:\MC\.minecraft\libraries\io\netty\netty-common\4.1.82.Final\netty-common-4.1.82.Final.jar;D:\MC\.minecraft\libraries\io\netty\netty-handler\4.1.82.Final\netty-handler-4.1.82.Final.jar;D:\MC\.minecraft\libraries\io\netty\netty-resolver\4.1.82.Final\netty-resolver-4.1.82.Final.jar;D:\MC\.minecraft\libraries\io\netty\netty-transport-classes-epoll\4.1.82.Final\netty-transport-classes-epoll-4.1.82.Final.jar;D:\MC\.minecraft\libraries\io\netty\netty-transport-native-unix-common\4.1.82.Final\netty-transport-native-unix-common-4.1.82.Final.jar;D:\MC\.minecraft\libraries\io\netty\netty-transport\4.1.82.Final\netty-transport-4.1.82.Final.jar;D:\MC\.minecraft\libraries\it\unimi\dsi\fastutil\8.5.9\fastutil-8.5.9.jar;D:\MC\.minecraft\libraries\net\java\dev\jna\jna-platform\5.12.1\jna-platform-5.12.1.jar;D:\MC\.minecraft\libraries\net\java\dev\jna\jna\5.12.1\jna-5.12.1.jar;D:\MC\.minecraft\libraries\net\sf\jopt-simple\jopt-simple\5.0.4\jopt-simple-5.0.4.jar;D:\MC\.minecraft\libraries\org\apache\commons\commons-compress\1.21\commons-compress-1.21.jar;D:\MC\.minecraft\libraries\org\apache\commons\commons-lang3\3.12.0\commons-lang3-3.12.0.jar;D:\MC\.minecraft\libraries\org\apache\httpcomponents\httpclient\4.5.13\httpclient-4.5.13.jar;D:\MC\.minecraft\libraries\org\apache\httpcomponents\httpcore\4.4.15\httpcore-4.4.15.jar;D:\MC\.minecraft\libraries\org\apache\logging\log4j\log4j-api\2.19.0\log4j-api-2.19.0.jar;D:\MC\.minecraft\libraries\org\apache\logging\log4j\log4j-core\2.19.0\log4j-core-2.19.0.jar;D:\MC\.minecraft\libraries\org\apache\logging\log4j\log4j-slf4j2-impl\2.19.0\log4j-slf4j2-impl-2.19.0.jar;D:\MC\.minecraft\libraries\org\joml\joml\1.10.5\joml-1.10.5.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl-glfw\3.3.1\lwjgl-glfw-3.3.1.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl-glfw\3.3.1\lwjgl-glfw-3.3.1-natives-windows.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl-glfw\3.3.1\lwjgl-glfw-3.3.1-natives-windows-arm64.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl-glfw\3.3.1\lwjgl-glfw-3.3.1-natives-windows-x86.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl-jemalloc\3.3.1\lwjgl-jemalloc-3.3.1.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl-jemalloc\3.3.1\lwjgl-jemalloc-3.3.1-natives-windows.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl-jemalloc\3.3.1\lwjgl-jemalloc-3.3.1-natives-windows-arm64.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl-jemalloc\3.3.1\lwjgl-jemalloc-3.3.1-natives-windows-x86.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl-openal\3.3.1\lwjgl-openal-3.3.1.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl-openal\3.3.1\lwjgl-openal-3.3.1-natives-windows.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl-openal\3.3.1\lwjgl-openal-3.3.1-natives-windows-arm64.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl-openal\3.3.1\lwjgl-openal-3.3.1-natives-windows-x86.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl-opengl\3.3.1\lwjgl-opengl-3.3.1.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl-opengl\3.3.1\lwjgl-opengl-3.3.1-natives-windows.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl-opengl\3.3.1\lwjgl-opengl-3.3.1-natives-windows-arm64.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl-opengl\3.3.1\lwjgl-opengl-3.3.1-natives-windows-x86.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl-stb\3.3.1\lwjgl-stb-3.3.1.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl-stb\3.3.1\lwjgl-stb-3.3.1-natives-windows.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl-stb\3.3.1\lwjgl-stb-3.3.1-natives-windows-arm64.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl-stb\3.3.1\lwjgl-stb-3.3.1-natives-windows-x86.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl-tinyfd\3.3.1\lwjgl-tinyfd-3.3.1.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl-tinyfd\3.3.1\lwjgl-tinyfd-3.3.1-natives-windows.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl-tinyfd\3.3.1\lwjgl-tinyfd-3.3.1-natives-windows-arm64.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl-tinyfd\3.3.1\lwjgl-tinyfd-3.3.1-natives-windows-x86.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl\3.3.1\lwjgl-3.3.1.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl\3.3.1\lwjgl-3.3.1-natives-windows.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl\3.3.1\lwjgl-3.3.1-natives-windows-arm64.jar;D:\MC\.minecraft\libraries\org\lwjgl\lwjgl\3.3.1\lwjgl-3.3.1-natives-windows-x86.jar;D:\MC\.minecraft\libraries\org\slf4j\slf4j-api\2.0.1\slf4j-api-2.0.1.jar;D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\机械动力-1.20.1-[Forge].jar -Djava.net.preferIPv6Addresses=system -DignoreList=bootstraplauncher,securejarhandler,asm-commons,asm-util,asm-analysis,asm-tree,asm,JarJarFileSystems,client-extra,fmlcore,javafmllanguage,lowcodelanguage,mclanguage,forge-,机械动力-1.20.1-[Forge].jar,机械动力-1.20.1-[Forge].jar -DmergeModules=jna-5.10.0.jar,jna-platform-5.10.0.jar -DlibraryDirectory=D:\MC\.minecraft\libraries -p D:\MC\.minecraft\libraries/cpw/mods/bootstraplauncher/1.1.2/bootstraplauncher-1.1.2.jar;D:\MC\.minecraft\libraries/cpw/mods/securejarhandler/2.1.10/securejarhandler-2.1.10.jar;D:\MC\.minecraft\libraries/org/ow2/asm/asm-commons/9.5/asm-commons-9.5.jar;D:\MC\.minecraft\libraries/org/ow2/asm/asm-util/9.5/asm-util-9.5.jar;D:\MC\.minecraft\libraries/org/ow2/asm/asm-analysis/9.5/asm-analysis-9.5.jar;D:\MC\.minecraft\libraries/org/ow2/asm/asm-tree/9.5/asm-tree-9.5.jar;D:\MC\.minecraft\libraries/org/ow2/asm/asm/9.5/asm-9.5.jar;D:\MC\.minecraft\libraries/net/minecraftforge/JarJarFileSystems/0.3.19/JarJarFileSystems-0.3.19.jar --add-modules ALL-MODULE-PATH --add-opens java.base/java.util.jar=cpw.mods.securejarhandler --add-opens java.base/java.lang.invoke=cpw.mods.securejarhandler --add-exports java.base/sun.security.util=cpw.mods.securejarhandler --add-exports jdk.naming.dns/com.sun.jndi.dns=java.naming cpw.mods.bootstraplauncher.BootstrapLauncher --username uxhf --version 机械动力-1.20.1-[Forge] --gameDir D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge] --assetsDir D:\MC\.minecraft\assets --assetIndex 5 --uuid 374b09c01e8b4b538520e08bde88d3e2 --accessToken <access token> --clientId ${clientid} --xuid ${auth_xuid} --userType msa --versionType "HMCL 3.7.5" --width 854 --height 480 --launchTarget forgeclient --fml.forgeVersion 47.2.19 --fml.mcVersion 1.20.1 --fml.forgeGroup net.minecraftforge --fml.mcpVersion 20230612.114412 [14:07:40] [main/INFO]: ModLauncher running: args [--username, uxhf, --version, 机械动力-1.20.1-[Forge], --gameDir, D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge], --assetsDir, D:\MC\.minecraft\assets, --assetIndex, 5, --uuid, 374b09c01e8b4b538520e08bde88d3e2, --accessToken, ❄❄❄❄❄❄❄❄, --clientId, ${clientid}, --xuid, ${auth_xuid}, --userType, msa, --versionType, HMCL 3.7.5, --width, 854, --height, 480, --launchTarget, forgeclient, --fml.forgeVersion, 47.2.19, --fml.mcVersion, 1.20.1, --fml.forgeGroup, net.minecraftforge, --fml.mcpVersion, 20230612.114412] [14:07:40] [main/INFO]: ModLauncher 10.0.9+10.0.9+main.dcd20f30 starting: java version 17.0.10 by Oracle Corporation; OS Windows 11 arch amd64 version 10.0 [14:07:43] [main/INFO]: Loading ImmediateWindowProvider fmlearlywindow [14:07:44] [main/INFO]: Trying GL version 4.6 [14:07:44] [main/INFO]: Requested GL version 4.6 got version 4.6 [14:07:44] [main/INFO]: SpongePowered MIXIN Subsystem Version=0.8.5 Source=union:/D:/MC/.minecraft/libraries/org/spongepowered/mixin/0.8.5/mixin-0.8.5.jar%23100!/ Service=ModLauncher Env=CLIENT [14:07:44] [pool-2-thread-1/INFO]: GL info: NVIDIA GeForce RTX 4060 Laptop GPU/PCIe/SSE2 GL version 4.6.0 NVIDIA 566.36, NVIDIA Corporation [14:07:44] [main/INFO]: Found mod file appleskin-forge-mc1.20.1-2.5.1.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file architectury-9.1.10-forge.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file badpackets-forge-0.4.1.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file BetterAdvancements-1.20.1-0.3.2.162.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file betterfpsdist-1.20.1-4.1.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file BetterTitleScreen-1.20-1.13.2.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file BoccHUD-0.1.1-mc1.20.1.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file chat_heads-0.10.30-forge-1.20.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file cloth-config-11.0.99-forge.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file ContingameIME-1.0.6-1.20.1-forge.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file Controlling-forge-1.20.1-12.0.2.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file copycats-3.0.2+mc.1.20.1-forge.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file create-1.20.1-6.0.8.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file create_connected-1.1.8-mc1.20.1-all.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file create_jetpack-forge-4.4.5.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file create_power_loader-2.0.3-mc1.20.1.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file createaddition-1.20.1-1.3.1.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file createbigcannons-5.9.1+mc.1.20.1-forge.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file createcontraptionterminals-1.20-1.2.0.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file createdieselgenerators-1.20.1-1.3.5.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file createendertransmission-2.1.0-1.20.1.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file createoreexcavation-1.20-1.6.5.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file CreativeCore_FORGE_v2.11.18_mc1.20.1.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file cupboard-1.20.1-2.2.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file curtain-mc1.20.1-1.3.2.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file CustomSkinLoader_ForgeActive-15.0-SNAPSHOT-10.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file CustomWindowTitle-Forge-1.20+v1.2.0.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file Durability101-forge-1.20-0.0.4.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file dynamiccrosshair-7.4.2+1.20-forge.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file entityculling-forge-1.6.2-mc1.20.1.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file Fastload-Reforged-mc1.20.1-3.4.0.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file ferritecore-6.0.0-forge.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file FpsReducer2-forge-1.20-2.5.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file gamemenumodoption-mc1.20.1-2.2.1.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file InventoryProfilesNext-forge-1.20-1.10.4.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file ItemPhysicLite_FORGE_v1.6.1_mc1.20.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file Jade-1.20.1-forge-11.7.1.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file jei-1.20.1-forge-15.2.0.27.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file kotlinforforge-4.3.0-all.jar of type LIBRARY with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file libIPN-forge-1.20-3.0.2.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file MaFgLib-0.1.3-mc1.20.1.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file mcwifipnp-1.6.6-1.20.1-forge.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file modernfix-forge-5.11.1+mc1.20.1.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file MouseTweaks-forge-mc1.20-2.25.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file notenoughanimations-forge-1.7.0-mc1.20.1.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file optcheck-1.19-1.5.0-forge.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file ritchiesprojectilelib-2.1.0+mc.1.20.1-forge.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file Rrls-1.20.1-3.1.0-forge.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file screenshot_viewer-1.2.1-forge-mc1.20.1.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file Searchables-forge-1.20.1-1.0.2.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file shulkerboxtooltip-forge-4.0.4+1.20.1.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file sound-physics-remastered-forge-1.20.1-1.3.1.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file Steam_Rails-1.6.7+forge-mc1.20.1.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file toms_storage-1.20-1.7.1.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file Tweakerge-0.1.1-mc1.20.1.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file Xaeros_Minimap_23.9.3_Forge_1.20.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file XaerosWorldMap_1.37.2_Forge_1.20.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file xplusworldloadopti-0.1.0-forge-mc1.20.1.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/INFO]: Found mod file YeetusExperimentus-Forge-2.3.1-build.6+mc1.20.1.jar of type MOD with provider {mods folder locator at D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge]\mods} [14:07:44] [main/WARN]: Mod file D:\MC\.minecraft\libraries\net\minecraftforge\fmlcore\1.20.1-47.2.19\fmlcore-1.20.1-47.2.19.jar is missing mods.toml file [14:07:44] [main/WARN]: Mod file D:\MC\.minecraft\libraries\net\minecraftforge\javafmllanguage\1.20.1-47.2.19\javafmllanguage-1.20.1-47.2.19.jar is missing mods.toml file [14:07:44] [main/WARN]: Mod file D:\MC\.minecraft\libraries\net\minecraftforge\lowcodelanguage\1.20.1-47.2.19\lowcodelanguage-1.20.1-47.2.19.jar is missing mods.toml file [14:07:44] [main/WARN]: Mod file D:\MC\.minecraft\libraries\net\minecraftforge\mclanguage\1.20.1-47.2.19\mclanguage-1.20.1-47.2.19.jar is missing mods.toml file [14:07:44] [main/INFO]: Found mod file fmlcore-1.20.1-47.2.19.jar of type LIBRARY with provider net.minecraftforge.fml.loading.moddiscovery.MinecraftLocator@4248ed58 [14:07:44] [main/INFO]: Found mod file javafmllanguage-1.20.1-47.2.19.jar of type LANGPROVIDER with provider net.minecraftforge.fml.loading.moddiscovery.MinecraftLocator@4248ed58 [14:07:44] [main/INFO]: Found mod file lowcodelanguage-1.20.1-47.2.19.jar of type LANGPROVIDER with provider net.minecraftforge.fml.loading.moddiscovery.MinecraftLocator@4248ed58 [14:07:44] [main/INFO]: Found mod file mclanguage-1.20.1-47.2.19.jar of type LANGPROVIDER with provider net.minecraftforge.fml.loading.moddiscovery.MinecraftLocator@4248ed58 [14:07:44] [main/INFO]: Found mod file client-1.20.1-20230612.114412-srg.jar of type MOD with provider net.minecraftforge.fml.loading.moddiscovery.MinecraftLocator@4248ed58 [14:07:44] [main/INFO]: Found mod file forge-1.20.1-47.2.19-universal.jar of type MOD with provider net.minecraftforge.fml.loading.moddiscovery.MinecraftLocator@4248ed58 [14:07:45] [main/WARN]: Attempted to select two dependency jars from JarJar which have the same identification: Mod File: and Mod File: . Using Mod File: [14:07:45] [main/WARN]: Attempted to select two dependency jars from JarJar which have the same identification: Mod File: and Mod File: . Using Mod File: [14:07:45] [main/INFO]: Found 10 dependencies adding them to mods collection [14:07:45] [main/INFO]: Found mod file flightlib-forge-2.2.1.jar of type MOD with provider net.minecraftforge.fml.loading.moddiscovery.JarInJarDependencyLocator@314ed053 [14:07:45] [main/INFO]: Found mod file yaclx-1.12+1.20.2-forge.jar of type MOD with provider net.minecraftforge.fml.loading.moddiscovery.JarInJarDependencyLocator@314ed053 [14:07:45] [main/INFO]: Found mod file kfflang-4.3.0.jar of type LANGPROVIDER with provider net.minecraftforge.fml.loading.moddiscovery.JarInJarDependencyLocator@314ed053 [14:07:45] [main/INFO]: Found mod file mixinextras-forge-0.2.0-beta.8.jar of type GAMELIBRARY with provider net.minecraftforge.fml.loading.moddiscovery.JarInJarDependencyLocator@314ed053 [14:07:45] [main/INFO]: Found mod file kffmod-4.3.0.jar of type MOD with provider net.minecraftforge.fml.loading.moddiscovery.JarInJarDependencyLocator@314ed053 [14:07:45] [main/INFO]: Found mod file flywheel-forge-1.20.1-1.0.5.jar of type MOD with provider net.minecraftforge.fml.loading.moddiscovery.JarInJarDependencyLocator@314ed053 [14:07:45] [main/INFO]: Found mod file kfflib-4.3.0.jar of type GAMELIBRARY with provider net.minecraftforge.fml.loading.moddiscovery.JarInJarDependencyLocator@314ed053 [14:07:45] [main/INFO]: Found mod file Registrate-MC1.20-1.3.3.jar of type GAMELIBRARY with provider net.minecraftforge.fml.loading.moddiscovery.JarInJarDependencyLocator@314ed053 [14:07:45] [main/INFO]: Found mod file Ponder-Forge-1.20.1-1.0.91.jar of type MOD with provider net.minecraftforge.fml.loading.moddiscovery.JarInJarDependencyLocator@314ed053 [14:07:45] [main/INFO]: Found mod file MixinExtras-0.4.1.jar of type GAMELIBRARY with provider net.minecraftforge.fml.loading.moddiscovery.JarInJarDependencyLocator@314ed053 [14:07:45] [main/ERROR]: Unsupported installed optional dependencies: Mod ID: 'jei', Requested by: 'create', Expected range: '[15.19.0,)', Actual version: '15.2.0.27' [14:07:46] [main/INFO]: Compatibility level set to JAVA_17 [14:07:46] [main/INFO]: Successfully loaded Mixin Connector [com.sonicether.soundphysics.MixinConnector] [14:07:46] [main/INFO]: Launching target 'forgeclient' with arguments [--version, 机械动力-1.20.1-[Forge], --gameDir, D:\MC\.minecraft\versions\机械动力-1.20.1-[Forge], --assetsDir, D:\MC\.minecraft\assets, --uuid, 374b09c01e8b4b538520e08bde88d3e2, --username, uxhf, --assetIndex, 5, --accessToken, ❄❄❄❄❄❄❄❄, --clientId, ${clientid}, --xuid, ${auth_xuid}, --userType, msa, --versionType, HMCL 3.7.5, --width, 854, --height, 480] [14:07:46] [main/INFO]: Loaded configuration file for ModernFix 5.11.1+mc1.20.1: 72 options available, 10 override(s) found [14:07:46] [main/WARN]: Option 'mixin.perf.deduplicate_wall_shapes' overriden (by load error) to 'false' [14:07:46] [main/WARN]: Option 'mixin.bugfix.paper_chunk_patches' overriden (by load error) to 'false' [14:07:46] [main/WARN]: Option 'mixin.perf.cache_strongholds' overriden (by load error) to 'false' [14:07:46] [main/WARN]: Option 'mixin.perf.faster_texture_stitching' overriden (by load error) to 'false' [14:07:46] [main/WARN]: Option 'mixin.bugfix.buffer_builder_leak' overriden (by load error) to 'false' [14:07:46] [main/WARN]: Option 'mixin.perf.nbt_memory_usage' overriden (by load error) to 'false' [14:07:46] [main/WARN]: Option 'mixin.bugfix.chunk_deadlock' overriden (by load error) to 'false' [14:07:46] [main/WARN]: Option 'mixin.perf.thread_priorities' overriden (by load error) to 'false' [14:07:46] [main/WARN]: Option 'mixin.launch.class_search_cache' overriden (by load error) to 'false' [14:07:46] [main/WARN]: Option 'mixin.perf.datapack_reload_exceptions' overriden (by load error) to 'false' [14:07:46] [main/INFO]: Applying Nashorn fix [14:07:46] [main/WARN]: Applying ATs from 24 mods despite being in errored state, this might cause a crash! [14:07:46] [main/INFO]: Applied Forge config corruption patch [14:07:47] [main/INFO]: OptiFine was NOT detected. [14:07:47] [main/INFO]: OptiFabric was NOT detected. [14:07:47] [main/WARN]: Reference map 'Rrls-forge-refmap.json' for rrls.mixins.json could not be read. If this is a development environment you can ignore this message [14:07:47] [main/WARN]: Error loading class: xfacthd/framedblocks/common/blockentity/doubled/FramedAdjustableDoubleBlockEntity (java.lang.ClassNotFoundException: xfacthd.framedblocks.common.blockentity.doubled.FramedAdjustableDoubleBlockEntity) [14:07:47] [main/WARN]: @Mixin target xfacthd.framedblocks.common.blockentity.doubled.FramedAdjustableDoubleBlockEntity was not found createbigcannons.mixins.json:compat.FramedAdjustableDoubleBlockEntityAccessor Exception in thread "main" java.lang.RuntimeException: java.lang.NoClassDefFoundError: com/simibubi/create/foundation/utility/Lang at MC-BOOTSTRAP/cpw.mods.modlauncher@10.0.9/cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:32) at MC-BOOTSTRAP/cpw.mods.modlauncher@10.0.9/cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:53) at MC-BOOTSTRAP/cpw.mods.modlauncher@10.0.9/cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:71) at MC-BOOTSTRAP/cpw.mods.modlauncher@10.0.9/cpw.mods.modlauncher.Launcher.run(Launcher.java:108) at MC-BOOTSTRAP/cpw.mods.modlauncher@10.0.9/cpw.mods.modlauncher.Launcher.main(Launcher.java:78) at MC-BOOTSTRAP/cpw.mods.modlauncher@10.0.9/cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:26) at MC-BOOTSTRAP/cpw.mods.modlauncher@10.0.9/cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:23) at cpw.mods.bootstraplauncher@1.1.2/cpw.mods.bootstraplauncher.BootstrapLauncher.main(BootstrapLauncher.java:141) Caused by: java.lang.NoClassDefFoundError: com/simibubi/create/foundation/utility/Lang at TRANSFORMER/railways@1.6.7+forge-mc1.20.1/com.railwayteam.railways.compat.Mods.asId(Mods.java:69) at TRANSFORMER/railways@1.6.7+forge-mc1.20.1/com.railwayteam.railways.compat.Mods.<init>(Mods.java:61) at TRANSFORMER/railways@1.6.7+forge-mc1.20.1/com.railwayteam.railways.compat.Mods.<init>(Mods.java:56) at TRANSFORMER/railways@1.6.7+forge-mc1.20.1/com.railwayteam.railways.compat.Mods.<clinit>(Mods.java:32) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at java.base/java.lang.Class.getEnumConstantsShared(Class.java:3837) at java.base/java.lang.Class.enumConstantDirectory(Class.java:3859) at java.base/java.lang.Enum.valueOf(Enum.java:267) at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.util.Annotations.toEnumValue(Annotations.java:796) at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.util.Annotations.getValue(Annotations.java:630) at TRANSFORMER/railways@1.6.7+forge-mc1.20.1/com.railwayteam.railways.util.ConditionalMixinManager.shouldApply(ConditionalMixinManager.java:48) at TRANSFORMER/railways@1.6.7+forge-mc1.20.1/com.railwayteam.railways.mixin.CRMixinPlugin.shouldApplyMixin(CRMixinPlugin.java:42) at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.mixin.transformer.PluginHandle.shouldApplyMixin(PluginHandle.java:132) at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.mixin.transformer.MixinInfo.shouldApplyMixin(MixinInfo.java:987) at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.mixin.transformer.MixinInfo.readDeclaredTargets(MixinInfo.java:952) at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.mixin.transformer.MixinInfo.<init>(MixinInfo.java:881) at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.mixin.transformer.MixinConfig.prepareMixins(MixinConfig.java:850) at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.mixin.transformer.MixinConfig.prepare(MixinConfig.java:775) at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.mixin.transformer.MixinProcessor.prepareConfigs(MixinProcessor.java:539) at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.mixin.transformer.MixinProcessor.select(MixinProcessor.java:462) at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.mixin.transformer.MixinProcessor.checkSelect(MixinProcessor.java:438) at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:290) at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClass(MixinTransformer.java:250) at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.service.modlauncher.MixinTransformationHandler.processClass(MixinTransformationHandler.java:131) at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.launch.MixinLaunchPluginLegacy.processClass(MixinLaunchPluginLegacy.java:131) at MC-BOOTSTRAP/cpw.mods.modlauncher@10.0.9/cpw.mods.modlauncher.serviceapi.ILaunchPluginService.processClassWithFlags(ILaunchPluginService.java:156) at MC-BOOTSTRAP/cpw.mods.modlauncher@10.0.9/cpw.mods.modlauncher.LaunchPluginHandler.offerClassNodeToPlugins(LaunchPluginHandler.java:88) at MC-BOOTSTRAP/cpw.mods.modlauncher@10.0.9/cpw.mods.modlauncher.ClassTransformer.transform(ClassTransformer.java:120) at MC-BOOTSTRAP/cpw.mods.modlauncher@10.0.9/cpw.mods.modlauncher.TransformingClassLoader.maybeTransformClassBytes(TransformingClassLoader.java:50) at cpw.mods.securejarhandler/cpw.mods.cl.ModuleClassLoader.readerToClass(ModuleClassLoader.java:113) at cpw.mods.securejarhandler/cpw.mods.cl.ModuleClassLoader.lambda$findClass$15(ModuleClassLoader.java:219) at cpw.mods.securejarhandler/cpw.mods.cl.ModuleClassLoader.loadFromModule(ModuleClassLoader.java:229) at cpw.mods.securejarhandler/cpw.mods.cl.ModuleClassLoader.findClass(ModuleClassLoader.java:219) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:632) at java.base/java.lang.Class.forName(Class.java:545) at MC-BOOTSTRAP/fmlearlydisplay@1.20.1-47.2.19/net.minecraftforge.fml.earlydisplay.DisplayWindow.lambda$updateModuleReads$18(DisplayWindow.java:598) at java.base/java.util.Optional.map(Optional.java:260) at MC-BOOTSTRAP/fmlearlydisplay@1.20.1-47.2.19/net.minecraftforge.fml.earlydisplay.DisplayWindow.updateModuleReads(DisplayWindow.java:598) at MC-BOOTSTRAP/fmlloader@1.20.1-47.2.19/net.minecraftforge.fml.loading.ImmediateWindowHandler.acceptGameLayer(ImmediateWindowHandler.java:71) at MC-BOOTSTRAP/fmlloader@1.20.1-47.2.19/net.minecraftforge.fml.loading.FMLLoader.beforeStart(FMLLoader.java:207) at MC-BOOTSTRAP/fmlloader@1.20.1-47.2.19/net.minecraftforge.fml.loading.targets.CommonLaunchHandler.launchService(CommonLaunchHandler.java:92) at MC-BOOTSTRAP/cpw.mods.modlauncher@10.0.9/cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:30) ... 7 more Caused by: java.lang.ClassNotFoundException: com.simibubi.create.foundation.utility.Lang at cpw.mods.securejarhandler/cpw.mods.cl.ModuleClassLoader.loadClass(ModuleClassLoader.java:141) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ... 52 more以上是一段我的世界的报错代码帮我看一下是什么问题
11-09
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值