20个使用 Java CompletableFuture的示例,so easy!

本文通过20个示例深入讲解Java8的CompletionStageAPI及其标准实现CompletableFuture,展示了如何创建、运行异步阶段,处理计算结果,以及如何在多个阶段间进行同步和异步的数据流转。

在Java中异步编程,不一定非要使用rxJava, Java本身的库中的CompletableFuture可以很好的应对大部分的场景。

这篇文章介绍 Java 8 的 CompletionStageAPI和它的标准库的实现CompletableFuture。API通过例子的方式演示了它的行为,每个例子演示一到两个行为。

既然CompletableFuture类实现了CompletionStage接口,首先我们需要理解这个接口的契约。它代表了一个特定的计算的阶段,可以同步或者异步的被完成。你可以把它看成一个计算流水线上的一个单元,最终会产生一个最终结果,这意味着几个CompletionStage可以串联起来,一个完成的阶段可以触发下一阶段的执行,接着触发下一次,接着……

除了实现CompletionStage接口,CompletableFuture也实现了future接口, 代表一个未完成的异步事件。CompletableFuture提供了方法,能够显式地完成这个future,所以它叫CompletableFuture。

1、 创建一个完成的CompletableFuture

最简单的例子就是使用一个预定义的结果创建一个完成的CompletableFuture,通常我们会在计算的开始阶段使用它。

static void completedFutureExample() {
    CompletableFuture cf = CompletableFuture.completedFuture("message");
    assertTrue(cf.isDone());
    assertEquals("message", cf.getNow(null));
}

getNow(null)方法在future完成的情况下会返回结果,就比如上面这个例子,否则返回null (传入的参数)。

2、运行一个简单的异步阶段

这个例子创建一个一个异步执行的阶段:

static void runAsyncExample() {
    CompletableFuture cf = CompletableFuture.runAsync(() -> {
        assertTrue(Thread.currentThread().isDaemon());
        randomSleep();
    });
    assertFalse(cf.isDone());
    sleepEnough();
    assertTrue(cf.isDone());
}

通过这个例子可以学到两件事情:
CompletableFuture的方法如果以Async结尾,它会异步的执行(没有指定executor的情况下), 异步执行通过ForkJoinPool实现, 它使用守护线程去执行任务。注意这是CompletableFuture的特性, 其它CompletionStage可以override这个默认的行为。

3、在前一个阶段上应用函数

下面这个例子使用前面 #1 的完成的CompletableFuture, #1返回结果为字符串message,然后应用一个函数把它变成大写字母。

static void thenApplyExample() {
    CompletableFuture cf = CompletableFuture.completedFuture("message").thenApply(s -> {
        assertFalse(Thread.currentThread().isDaemon());
        return s.toUpperCase();
    });
    assertEquals("MESSAGE", cf.getNow(null));
}

注意thenApply方法名称代表的行为。

then意味着这个阶段的动作发生当前的阶段正常完成之后。本例中,当前节点完成,返回字符串message。

Apply意味着返回的阶段将会对结果前一阶段的结果应用一个函数。

函数的执行会被阻塞,这意味着getNow()只有打斜操作被完成后才返回。

4、在前一个阶段上异步应用函数

通过调用异步方法(方法后边加Async后缀),串联起来的CompletableFuture可以异步地执行(使用ForkJoinPool.commonPool())。

static void thenApplyAsyncExample() {
    CompletableFuture cf = CompletableFuture.completedFuture("message").thenApplyAsync(s -> {
        assertTrue(Thread.currentThread().isDaemon());
        randomSleep();
        return s.toUpperCase();
    });
    assertNull(cf.getNow(null));
    assertEquals("MESSAGE", cf.join());
}

5、使用定制的Executor在前一个阶段上异步应用函数

异步方法一个非常有用的特性就是能够提供一个Executor来异步地执行CompletableFuture
这个例子演示了如何使用一个固定大小的线程池来应用大写函数

static ExecutorService executor = Executors.newFixedThreadPool(3, new ThreadFactory() {
    int count = 1;
 
    @Override
    public Thread newThread(Runnable runnable) {
        return new Thread(runnable, "custom-executor-" + count++);
    }
});
 
static void thenApplyAsyncWithExecutorExample() {
    CompletableFuture cf = CompletableFuture.completedFuture("message").thenApplyAsync(s -> {
        assertTrue(Thread.currentThread().getName().startsWith("custom-executor-"));
        assertFalse(Thread.currentThread().isDaemon());
        randomSleep();
        return s.toUpperCase();
    }, executor);
 
    assertNull(cf.getNow(null));
    assertEquals("MESSAGE", cf.join());
}

6、消费前一阶段的结果

如果下一阶段接收了当前阶段的结果,但是在计算的时候不需要返回值(它的返回类型是void), 那么它可以不应用一个函数,而是一个消费者, 调用方法也变成了thenAccept:

static void thenAcceptExample() {
    StringBuilder result = new StringBuilder();
    CompletableFuture.completedFuture("thenAccept message")
            .thenAccept(s -> result.append(s));
    assertTrue("Result was empty", result.length() > 0);
}

本例中消费者同步地执行,所以我们不需要在CompletableFuture调用join方法。

7、异步地消费迁移阶段的结果

同样,可以使用thenAcceptAsync方法, 串联的CompletableFuture可以异步地执行。

static void thenAcceptAsyncExample() {
    StringBuilder result = new StringBuilder();
    CompletableFuture cf = CompletableFuture.completedFuture("thenAcceptAsync message")
            .thenAcceptAsync(s -> result.append(s));
    cf.join();
    assertTrue("Result was empty", result.length() > 0);
}

8、完成计算异常

现在我们来看一下异步操作如何显式地返回异常,用来指示计算失败。我们简化这个例子,操作处理一个字符串,把它转换成答谢,我们模拟延迟一秒。
我们使用thenApplyAsync(Function, Executor)方法,第一个参数传入大写函数, executor是一个delayed executor,在执行前会延迟一秒。

static void completeExceptionallyExample() {
    CompletableFuture cf = CompletableFuture.completedFuture("message").thenApplyAsync(String::toUpperCase,
            CompletableFuture.delayedExecutor(1, TimeUnit.SECONDS));
    CompletableFuture exceptionHandler = cf.handle((s, th) -> { return (th != null) ? "message upon cancel" : ""; });
    cf.completeExceptionally(new RuntimeException("completed exceptionally"));
assertTrue("Was not completed exceptionally", cf.isCompletedExceptionally());
    try {
        cf.join();
        fail("Should have thrown an exception");
    } catch(CompletionException ex) { // just for testing
        assertEquals("completed exceptionally", ex.getCause().getMessage());
    }
 
    assertEquals("message upon cancel", exceptionHandler.join());
}

让我们看一下细节。
首先我们创建了一个CompletableFuture, 完成后返回一个字符串message,接着我们调用thenApplyAsync方法,它返回一个CompletableFuture。这个方法在第一个函数完成后,异步地应用转大写字母函数。

这个例子还演示了如何通过delayedExecutor(timeout, timeUnit)延迟执行一个异步任务。

我们创建了一个分离的handler阶段:exceptionHandler, 它处理异常异常,在异常情况下返回message upon cancel。

下一步我们显式地用异常完成第二个阶段。在阶段上调用join方法,它会执行大写转换,然后抛出CompletionException(正常的join会等待1秒,然后得到大写的字符串。不过我们的例子还没等它执行就完成了异常), 然后它触发了handler阶段。

9、取消计算

和完成异常类似,我们可以调用cancel(boolean mayInterruptIfRunning)取消计算。对于CompletableFuture类,布尔参数并没有被使用,这是因为它并没有使用中断去取消操作,相反,cancel等价于completeExceptionally(new CancellationException())。

static void cancelExample() {
    CompletableFuture cf = CompletableFuture.completedFuture("message").thenApplyAsync(String::toUpperCase,
            CompletableFuture.delayedExecutor(1, TimeUnit.SECONDS));
    CompletableFuture cf2 = cf.exceptionally(throwable -> "canceled message");
    assertTrue("Was not canceled", cf.cancel(true));
    assertTrue("Was not completed exceptionally", cf.isCompletedExceptionally());
    assertEquals("canceled message", cf2.join());
}

10、在两个完成的阶段其中之一上应用函数

下面的例子创建了CompletableFuture, applyToEither处理两个阶段, 在其中之一上应用函数(包保证哪一个被执行)。

本例中的两个阶段一个是应用大写转换在原始的字符串上, 另一个阶段是应用小些转换。

static void applyToEitherExample() {
    String original = "Message";
    CompletableFuture cf1 = CompletableFuture.completedFuture(original)
            .thenApplyAsync(s -> delayedUpperCase(s));
    CompletableFuture cf2 = cf1.applyToEither(
            CompletableFuture.completedFuture(original).thenApplyAsync(s -> delayedLowerCase(s)),
            s -> s + " from applyToEither");
    assertTrue(cf2.join().endsWith(" from applyToEither"));
}

11、在两个完成的阶段其中之一上调用消费函数

和前一个例子很类似了,只不过我们调用的是消费者函数 (Function变成Consumer):

static void acceptEitherExample() {
    String original = "Message";
    StringBuilder result = new StringBuilder();
    CompletableFuture cf = CompletableFuture.completedFuture(original)
            .thenApplyAsync(s -> delayedUpperCase(s))
            .acceptEither(CompletableFuture.completedFuture(original).thenApplyAsync(s -> delayedLowerCase(s)),
                    s -> result.append(s).append("acceptEither"));
    cf.join();
    assertTrue("Result was empty", result.toString().endsWith("acceptEither"));
}

12、在两个阶段都执行完后运行一个Runnable

这个例子演示了依赖的CompletableFuture如果等待两个阶段完成后执行了一个Runnable。注意下面所有的阶段都是同步执行的,第一个阶段执行大写转换,第二个阶段执行小写转换。

static void runAfterBothExample() {
    String original = "Message";
    StringBuilder result = new StringBuilder();
    CompletableFuture.completedFuture(original).thenApply(String::toUpperCase).runAfterBoth(
            CompletableFuture.completedFuture(original).thenApply(String::toLowerCase),
            () -> result.append("done"));
    assertTrue("Result was empty", result.length() > 0);
}

13、 使用BiConsumer处理两个阶段的结果

上面的例子还可以通过BiConsumer来实现:

static void thenAcceptBothExample() {
    String original = "Message";
    StringBuilder result = new StringBuilder();
    CompletableFuture.completedFuture(original).thenApply(String::toUpperCase).thenAcceptBoth(
            CompletableFuture.completedFuture(original).thenApply(String::toLowerCase),
            (s1, s2) -> result.append(s1 + s2));
    assertEquals("MESSAGEmessage", result.toString());
}

14、使用BiFunction处理两个阶段的结果

如果CompletableFuture依赖两个前面阶段的结果, 它复合两个阶段的结果再返回一个结果,我们就可以使用thenCombine()函数。整个流水线是同步的,所以getNow()会得到最终的结果,它把大写和小写字符串连接起来。

static void thenCombineExample() {
    String original = "Message";
    CompletableFuture cf = CompletableFuture.completedFuture(original).thenApply(s -> delayedUpperCase(s))
            .thenCombine(CompletableFuture.completedFuture(original).thenApply(s -> delayedLowerCase(s)),
                    (s1, s2) -> s1 + s2);
    assertEquals("MESSAGEmessage", cf.getNow(null));
}

15、异步使用BiFunction处理两个阶段的结果

类似上面的例子,但是有一点不同:依赖的前两个阶段异步地执行,所以thenCombine()也异步地执行,即时它没有Async后缀。

Javadoc中有注释:

Actions supplied for dependent completions of non-async methods may be performed by the thread that completes the current CompletableFuture, or by any other caller of a completion method

所以我们需要join方法等待结果的完成。

static void thenCombineAsyncExample() {
    String original = "Message";
    CompletableFuture cf = CompletableFuture.completedFuture(original)
            .thenApplyAsync(s -> delayedUpperCase(s))
            .thenCombine(CompletableFuture.completedFuture(original).thenApplyAsync(s -> delayedLowerCase(s)),
                    (s1, s2) -> s1 + s2);
    assertEquals("MESSAGEmessage", cf.join());
}

16、组合 CompletableFuture

我们可以使用thenCompose()完成上面两个例子。这个方法等待第一个阶段的完成(大写转换), 它的结果传给一个指定的返回CompletableFuture函数,它的结果就是返回的CompletableFuture的结果。

有点拗口,但是我们看例子来理解。函数需要一个大写字符串做参数,然后返回一个CompletableFuture, 这个CompletableFuture会转换字符串变成小写然后连接在大写字符串的后面。

static void thenComposeExample() {
    String original = "Message";
    CompletableFuture cf = CompletableFuture.completedFuture(original).thenApply(s -> delayedUpperCase(s))
            .thenCompose(upper -> CompletableFuture.completedFuture(original).thenApply(s -> delayedLowerCase(s))
                    .thenApply(s -> upper + s));
    assertEquals("MESSAGEmessage", cf.join());
}

17、当几个阶段中的一个完成,创建一个完成的阶段

下面的例子演示了当任意一个CompletableFuture完成后, 创建一个完成的CompletableFuture.

待处理的阶段首先创建, 每个阶段都是转换一个字符串为大写。因为本例中这些阶段都是同步地执行(thenApply), 从anyOf中创建的CompletableFuture会立即完成,这样所有的阶段都已完成,我们使用whenComplete(BiConsumer<? super Object, ? super Throwable> action)处理完成的结果。

static void anyOfExample() {
    StringBuilder result = new StringBuilder();
    List messages = Arrays.asList("a", "b", "c");
    List<CompletableFuture> futures = messages.stream()
            .map(msg -> CompletableFuture.completedFuture(msg).thenApply(s -> delayedUpperCase(s)))
            .collect(Collectors.toList());
    CompletableFuture.anyOf(futures.toArray(new CompletableFuture[futures.size()])).whenComplete((res, th) -> {
        if(th == null) {
            assertTrue(isUpperCase((String) res));
            result.append(res);
        }
    });
    assertTrue("Result was empty", result.length() > 0);
}

18、当所有的阶段都完成后创建一个阶段

上一个例子是当任意一个阶段完成后接着处理,接下来的两个例子演示当所有的阶段完成后才继续处理, 同步地方式和异步地方式两种。

static void allOfExample() {
    StringBuilder result = new StringBuilder();
    List messages = Arrays.asList("a", "b", "c");
    List<CompletableFuture> futures = messages.stream()
            .map(msg -> CompletableFuture.completedFuture(msg).thenApply(s -> delayedUpperCase(s)))
            .collect(Collectors.toList());
    CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()])).whenComplete((v, th) -> {
        futures.forEach(cf -> assertTrue(isUpperCase(cf.getNow(null))));
        result.append("done");
    });
    assertTrue("Result was empty", result.length() > 0);
}

19、当所有的阶段都完成后异步地创建一个阶段

使用thenApplyAsync()替换那些单个的CompletableFutures的方法,allOf()会在通用池中的线程中异步地执行。所以我们需要调用join方法等待它完成。

static void allOfAsyncExample() {
    StringBuilder result = new StringBuilder();
    List messages = Arrays.asList("a", "b", "c");
    List<CompletableFuture> futures = messages.stream()
            .map(msg -> CompletableFuture.completedFuture(msg).thenApplyAsync(s -> delayedUpperCase(s)))
            .collect(Collectors.toList());
    CompletableFuture allOf = CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()]))
            .whenComplete((v, th) -> {
                futures.forEach(cf -> assertTrue(isUpperCase(cf.getNow(null))));
                result.append("done");
            });
    allOf.join();
    assertTrue("Result was empty", result.length() > 0);
}

20、真实的例子

现在你已经了解了CompletionStageCompletableFuture 的一些函数的功能,下面的例子是一个实践场景:

首先异步调用cars方法获得Car的列表,它返回CompletionStage场景。cars消费一个远程的REST API。

然后我们复合一个CompletionStage填写每个汽车的评分,通过rating(manufacturerId)返回一个CompletionStage, 它会异步地获取汽车的评分(可能又是一个REST API调用)

当所有的汽车填好评分后,我们结束这个列表,所以我们调用allOf得到最终的阶段, 它在前面阶段所有阶段完成后才完成。
在最终的阶段调用whenComplete(),我们打印出每个汽车和它的评分。

cars().thenCompose(cars -> {
    List<CompletionStage> updatedCars = cars.stream()
            .map(car -> rating(car.manufacturerId).thenApply(r -> {
                car.setRating(r);
                return car;
            })).collect(Collectors.toList());
 
    CompletableFuture done = CompletableFuture
            .allOf(updatedCars.toArray(new CompletableFuture[updatedCars.size()]));
    return done.thenApply(v -> updatedCars.stream().map(CompletionStage::toCompletableFuture)
            .map(CompletableFuture::join).collect(Collectors.toList()));
}).whenComplete((cars, th) -> {
    if (th == null) {
        cars.forEach(System.out::println);
    } else {
        throw new RuntimeException(th);
    }
}).toCompletableFuture().join();

因为每个汽车的实例都是独立的,得到每个汽车的评分都可以异步地执行,这会提高系统的性能(延迟),而且,等待所有的汽车评分被处理使用的是allOf方法,而不是手工的线程等待(Thread#join()或 a CountDownLatch)。

{"pid":66126} root@C202509151846323:/home/steam/games/arclight-forge-1.20.1# root@C202509151846323:/home/steam/games/arclight-forge-1.20.1# java -jar arclight-forge-1.20.1.jar 选择的语言 en_ 不可用 正在使用 en_ 语言,zh_cn 作为备选语言 [16:36:27 INFO] [Arclight]: ___ ___ __ /\ / | ________/ (_)__ / / / / / /| |/ __/ __/ / / _ / _ \/__/ / ___ / / / /_/ / / / / // / / /_/ |/_/ \__/_/_/\_ /_//_/ / /__/ \/ 运行版本 顿顽 / arclight-1.20.1-1.0.6-4e94eb76 构建日期 2025-01-21 16:18:32 [16:36:27 INFO] [c.m.m.Launcher/MODLAUNCHER]: ModLauncher running: args [--launchTarget, arclightserver, --fml.forgeVersion, 47.3.22, --fml.mcVersion, 1.20.1, --fml.forgeGroup, net.minecraftforge, --fml.mcpVersion, 20230612.114412] [16:36:27 INFO] [c.m.m.Launcher/MODLAUNCHER]: ModLauncher 10.0.9+10.0.9+main.dcd20f30 starting: java version 21.0.8 by Ubuntu; OS Linux arch amd64 version 6.8.0-48-generic [16:36:29 INFO]: ImmediateWindowProvider not loading because launch target is arclightserver [16:36:29 INFO] [mixin]: SpongePowered MIXIN Subsystem Version=0.8.5 Source=union:/home/steam/games/arclight-forge-1.20.1/libraries/org/spongepowered/mixin/0.8.5/mixin-0.8.5.jar%2399!/ Service=ModLauncher Env=SERVER [2025-09-26 16:36:30] [INFO]: I18nUpdate Mod 3.5.0 is loaded in 1.20.1 with Forge [2025-09-26 16:36:30] [INFO]: Downloading: http://downloader1.meitangdehulu.com:22943/Minecraft-Mod-Language-Modpack-1-19.zip -> /root/.i18nupdatemod/1.19.3/Minecraft-Mod-Language-Modpack-1-19.zip.tmp [2025-09-26 16:36:30] [INFO]: Downloading: http://downloader1.meitangdehulu.com:22943/Minecraft-Mod-Language-Modpack-1-18.zip -> /root/.i18nupdatemod/1.18.2/Minecraft-Mod-Language-Modpack-1-18.zip.tmp [2025-09-26 16:36:31] [INFO]: Converting: /root/.i18nupdatemod/1.19.3/Minecraft-Mod-Language-Modpack-1-19.zip [2025-09-26 16:36:31] [INFO]: Converting: /root/.i18nupdatemod/1.18.2/Minecraft-Mod-Language-Modpack-1-18.zip [2025-09-26 16:36:32] [INFO]: Converted: [/root/.i18nupdatemod/1.19.3/Minecraft-Mod-Language-Modpack-1-19.zip, /root/.i18nupdatemod/1.18.2/Minecraft-Mod-Language-Modpack-1-18.zip] -> /root/.i18nupdatemod/1.20.1/Minecraft-Mod-Language-Modpack-Converted-1.20.1.zip [2025-09-26 16:36:33] [INFO]: Synchronized: /root/.i18nupdatemod/1.20.1/Minecraft-Mod-Language-Modpack-Converted-1.20.1.zip -> ./resourcepacks/Minecraft-Mod-Language-Modpack-Converted-1.20.1.zip [2025-09-26 16:36:33] [INFO]: Resource Packs: ["file/Minecraft-Mod-Language-Modpack-Converted-1.20.1.zip"] [16:36:34 WARN]: Mod file /home/steam/games/arclight-forge-1.20.1/libraries/net/minecraftforge/fmlcore/1.20.1-47.3.22/fmlcore-1.20.1-47.3.22.jar is missing mods.toml file [16:36:34 WARN]: Mod file /home/steam/games/arclight-forge-1.20.1/libraries/net/minecraftforge/javafmllanguage/1.20.1-47.3.22/javafmllanguage-1.20.1-47.3.22.jar is missing mods.toml file [16:36:34 WARN]: Mod file /home/steam/games/arclight-forge-1.20.1/libraries/net/minecraftforge/lowcodelanguage/1.20.1-47.3.22/lowcodelanguage-1.20.1-47.3.22.jar is missing mods.toml file [16:36:34 WARN]: Mod file /home/steam/games/arclight-forge-1.20.1/libraries/net/minecraftforge/mclanguage/1.20.1-47.3.22/mclanguage-1.20.1-47.3.22.jar is missing mods.toml file [16:36:34 WARN]: Attempted to select two dependency jars from JarJar which have the same identification: Mod File: and Mod File: . Using Mod File: [16:36:34 INFO]: Found 14 dependencies adding them to mods collection [16:36:54 ERROR] [mixin]: Mixin config dynamiclightsreforged.mixins.json does not specify "minVersion" property [16:36:54 INFO] [mixin]: Compatibility level set to JAVA_17 [16:36:54 ERROR] [mixin]: Mixin config offhandcombat-common.mixins.json does not specify "minVersion" property [16:36:54 ERROR] [mixin]: Mixin config offhandcombat.mixins.json does not specify "minVersion" property [16:36:55 INFO] [mixin]: Successfully loaded Mixin Connector [io.izzel.arclight.common.mod.ArclightConnector] [16:36:55 INFO] [Arclight]: 核心 Mixin 配置已加载 [16:36:55 INFO] [Arclight]: 服务端优化 Mixin 配置已加载 [16:36:55 INFO] [c.m.m.LaunchServiceHandler/MODLAUNCHER]: Launching target 'arclightserver' with arguments [] [16:36:55 INFO] [Embeddium]: Loaded configuration file for Embeddium: 168 options available, 3 override(s) found [16:36:55 WARN] [mixin]: Reference map 'graveyard-FORGE-forge-refmap.json' for graveyard-forge.mixins.json could not be read. If this is a development environment you can ignore this message [16:36:55 INFO] [Redirectionor]: Loaded configuration file for Redirectionor: 85 options available, 0 override(s) found [16:36:55 WARN] [Redirectionor]: Redirectionor is going to load. [16:36:55 WARN] [Redirectionor]: It's possible that you will see some mixin applying failures or skipping in this log [16:36:55 WARN] [Redirectionor]: But you don't really need to care much about them as they're normal things existing for the best compatibility. [16:36:55 WARN] [Redirectionor]: If you encounter any problem, report it in my issue tracker: https://github.com/MCTeamPotato/Kasualix-Issue-Tracker/issues [16:36:56 INFO] [Canary]: Loaded configuration file for Canary: 116 options available, 0 override(s) found [16:36:56 WARN] [mixin]: Reference map 'coroutil.refmap.json' for coroutil.mixins.json could not be read. If this is a development environment you can ignore this message [16:36:56 INFO] [Puzzles Lib]: Loading 123 mods: - additionalguns 0.8.2 - advancednetherite 2.1.3 - ambientsounds 5.3.9 - ante 1.1 - appleskin 2.5.1+mc1.20.1 - architectury 9.1.12 - arclight 1.20.1-1.0.6-SNAPSHOT-1345853c - attackspeedenchantment 0.0NONE - attributefix 21.0.2 - badmobs 19.0.2 - betterburning 9.0.2 - betterchunkloading 1.20.1-2.1 - betterfoliage 5.0.2 - betterpingdisplay 1.1 - betterstrongholds 1.20-Forge-4.0.3 - betterthanmending 1.7.2 - bookshelf 20.0.4 - caelus 3.2.0+1.20.1 - canary 0.3.3 - carryon 2.1.2.7 - cfm 7.0.0-pre36 - cgm 1.4.18 - chunky 1.3.92 - clientcrafting 1.20.1-1.7 - cloth_config 11.1.118 - clumps 12.0.0.4 - collective 7.84 - configurablemobpotioneffects 3.3 - corgilib 4.0.1.3 - coroutil 1.20.1-1.3.7 - crafttweaker 14.0.21 - creativecore 2.11.27 - cupboard 1.20.1-1.9 - curios 5.8.1+1.20.1 - cursorcenteredfix 1.0 - dayzombierebooted 1.0.5 - doubledoors 5.7 - duckling 3.0.0 - dynamiclightsreforged 1.20.1_v1.6.0 - easy_villagers 1.20.1-1.1.4 - elytraslot 6.3.0+1.20.1 - embeddium 0.3.14+mc1.20.1 \-- rubidium 0.7.1 - embeddiumplus 1.2.7 \-- mixinextras 0.3.5 - enchdesc 17.0.5 - enhancedcelestials 0.0NONE - entity_texture_features 6.2.4 - entityculling 1.6.2 - fancymenu 3.1.5 - farmersdelight 1.20.1-1.2.4 - fastsuite 5.0.1 - ferritecore 6.0.0 - forcegl20 1.1.0 - forge 47.3.22 - forgeconfigscreens 8.0.2 - framework 0.7.6 - geckolib 4.4.7 - giantspawn 5.2 - globalpacks 1.16.2_forge - goblintraders 1.9.3 - golemsarefriends 1.20.0-1.0.1 - gpumemleakfix 1.20.1-1.6 - gravestone 1.20.1-1.0.15 - graveyard 3.1 - guardvillagers 0.0NONE - gunners 0.0.2 - iceberg 1.1.21 - imblocker 4.0.5 - immediatelyfast 1.2.3+1.20.1 - infinitetrading 4.5 - infwithmend 1.0.2 - inventoryprofilesnext 1.10.10 - inventorytotem 3.2 - jade 11.5.1 - jecharacters 1.20.1-4.4.1 - jei 15.2.0.27 - konkrete 1.8.0 - kotlinforforge 4.10.0 - lanserverproperties 1.11.1 - libipn 4.0.2 - mafglib 0.1.8-mc1.20.1 - maxenchantx 1.3 - melody 1.0.2 - memoryleakfix 1.1.2 - minecraft 1.20.1 - mousetweaks 2.25 - mutantmonsters 8.0.7 - neat 1.20-35-FORGE - notenoughcrashes 4.4.7+1.20.1 - nzgexpansion 1.4.4 - oculus 1.6.15a - offhandcombat 2.0.0 - overloadedarmorbar 1.20.1-1 - patchouli 1.20.1-81-FORGE - placebo 8.6.1 - polymorph 0.49.5+1.20.1 \-- spectrelib 0.13.15+1.20.1 - presencefootsteps 1.20.1-1.9.1-beta.1 - psg 4.01 - puzzleslib 8.1.22 \-- puzzlesaccessapi 8.0.7 - redirectionor 1.20.1-4.3.2 - retrodamageindicators 1.0.1 - seamless 2.2.2 - smoothboot 0.0.4 - spartanweaponry 3.1.3 - stackablepotions 1.0.0 - taxfreelevels 1.3.13 - tenshilib 1.20.1-1.7.6 - textrues_embeddium_options 0.1.5+mc1.20.1 \-- reeses_sodium_options 1.0.4 - tipsmod 12.0.2 - travelersbackpack 9.1.12 - tweakerge 0.1.2-mc1.20.1 - uteamcore 5.1.4.299 - veinmining 1.4.1+1.20.1 - voidtotem 3.0.1 - wi_zoom 1.5-MC1.20.1-Forge - xaerominimap 23.8.0 - xaeroworldmap 1.34.1 - yeetusexperimentus 2.3.0-build.4+mc1.20.1 - yungsapi 1.20-Forge-4.0.5 - zombieawareness 1.20.1-1.13.1 - zombiegame 1.20.1-1.2 [16:36:56 WARN] [mixin]: Reference map '${refmap_target}refmap.json' for corgilib.forge.mixins.json could not be read. If this is a development environment you can ignore this message [16:36:57 INFO]: Patching IForgeItemStack#getEnchantmentLevel [16:36:57 INFO]: Patching IForgeItemStack#getEnchantmentLevel [16:36:58 WARN] [mixin]: Error loading class: net/minecraft/client/gui/screens/inventory/AnvilScreen (java.lang.ClassNotFoundException: net.minecraft.client.gui.screens.inventory.AnvilScreen) [16:36:58 WARN] [mixin]: @Mixin target net.minecraft.client.gui.screens.inventory.AnvilScreen was not found ante.mixins.json:AnvilScreenMixin [16:36:58 WARN] [mixin]: Error loading class: xyz/przemyk/simpleplanes/upgrades/shooter/ShooterUpgrade (java.lang.ClassNotFoundException: xyz.przemyk.simpleplanes.upgrades.shooter.ShooterUpgrade) [16:36:58 WARN] [mixin]: @Mixin target xyz.przemyk.simpleplanes.upgrades.shooter.ShooterUpgrade was not found cgm.mixins.json:common.simpleplanes.ShooterUpgradeMixin [16:37:03 INFO] [memoryleakfix]: [MemoryLeakFix] Will be applying 1 memory leak fixes! [16:37:03 INFO] [memoryleakfix]: [MemoryLeakFix] Currently enabled memory leak fixes: [biomeTemperatureLeak] [16:37:04 INFO] [MixinExtras|Service]: Initializing MixinExtras via com.llamalad7.mixinextras.service.MixinExtrasServiceImpl(version=0.3.5). [16:37:04 WARN] [MixinExtras|Service]: Found problematic active MixinExtras instance at ca.fxco.memoryleakfix.mixinextras (version 0.2.0-beta.8) [16:37:04 WARN] [MixinExtras|Service]: Versions from 0.2.0-beta.1 to 0.2.0-beta.9 have limited support and it is strongly recommended to update. [16:37:06 INFO] [Smooth Boot (Reloaded)]: Smooth Boot (Reloaded) config initialized [LSP CoreMod] Patched: UUIDUtil.createOfflinePlayerUUID(String) [16:37:07 INFO]: Patching IForgeItemStack#getEnchantmentLevel [16:37:07 INFO]: Patching IForgeItemStack#getEnchantmentLevel [16:37:08 WARN] [mixin]: Method overwrite conflict for m_146897_ in mixins.arclight.impl.forge.optimization.json:EntityMixin_Optimize, previously written by com.abdelaziz.canary.mixin.alloc.deep_passengers.EntityMixin. Skipping method. [16:37:15 WARN] [mixin]: Static binding violation: PRIVATE @Overwrite method m_150430_ in mixins.arclight.core.json:world.inventory.AbstractContainerMenuMixin cannot reduce visibiliy of PROTECTED target method, visibility will be upgraded. [16:37:16 INFO]: Patching IForgeItemStack#getEnchantmentLevel [16:37:16 INFO]: Patching IForgeItemStack#getEnchantmentLevel [16:37:24 WARN] [mixin]: Mixin mixins.zombiegame.json:ZombieVillagerMixin has multiple constructors, (Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/level/Level;)V was selected [16:37:25 WARN] [mixin]: Mixin mixins.zombiegame.json:HuskMixin has multiple constructors, (Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/level/Level;)V was selected [16:37:25 WARN] [mixin]: @Final field f_26027_:Lnet/minecraft/world/entity/ai/targeting/TargetingConditions; in guardvillagers.mixins.json:DefendVillageGoalGolemMixin should be final [LSP CoreMod] Implemented: LanServerProperties.getLSPData()! [16:37:33 INFO] [dynamiclightsreforged]: [LambDynLights] Initializing Dynamic Lights Reforged... [16:37:33 WARN]: Configuration file /home/steam/games/arclight-forge-1.20.1/config/dynamic_lights_reforged.toml is not correct. Correcting [16:37:33 WARN]: Incorrect key Settings was corrected from null to its default, SimpleCommentedConfig:{}. [16:37:33 WARN]: Incorrect key Settings.Lighting Settings was corrected from null to its default, SimpleCommentedConfig:{}. [16:37:33 WARN]: Incorrect key Settings.Lighting Settings.Quality Mode (OFF, SLOW, FAST, REALTIME) was corrected from null to its default, REALTIME. [16:37:33 WARN]: Incorrect key Settings.Lighting Settings.Dynamic Entity Lighting was corrected from null to its default, true. [16:37:33 WARN]: Incorrect key Settings.Lighting Settings.Dynamic TileEntity Lighting was corrected from null to its default, true. [16:37:33 WARN]: Incorrect key Settings.Lighting Settings.Only Update On Position Change was corrected from null to its default, true. [16:37:33 INFO] [coroutil]: forge loader environment detected [16:37:33 WARN]: Configuration file /home/steam/games/arclight-forge-1.20.1/config/guardvillagers-common.toml is not correct. Correcting [16:37:33 WARN]: Incorrect key raids and illagers was corrected from null to its default, SimpleCommentedConfig:{}. [16:37:33 WARN]: Incorrect key raids and illagers.Illagers in raids attack animals? was corrected from null to its default, true. [16:37:33 WARN]: Incorrect key raids and illagers.Witches attack villagers? was corrected from null to its default, true. [16:37:33 WARN]: Incorrect key raids and illagers.Have Illusioners in raids? was corrected from null to its default, false. [16:37:33 WARN]: Incorrect key raids and illagers.Have Illagers have some common sense? was corrected from null to its default, true. [16:37:33 WARN]: Incorrect key mob ai in general was corrected from null to its default, SimpleCommentedConfig:{}. [16:37:33 WARN]: Incorrect key mob ai in general.Guards attack all mobs? was corrected from null to its default, true. [16:37:33 WARN]: Incorrect key mob ai in general.All mobs attack guards was corrected from null to its default, false. [16:37:33 WARN]: Incorrect key mob ai in general.Mob Blacklist was corrected from null to its default, [minecraft:villager, minecraft:iron_golem, minecraft:wandering_trader, guardvillagers:guard, minecraft:creeper, alexsmobs:komodo_dragon, minecraft:enderman]. [16:37:33 WARN]: Incorrect key mob ai in general.Mob Whitelist was corrected from null to its default, []. [16:37:33 WARN]: Incorrect key villager stuff was corrected from null to its default, SimpleCommentedConfig:{}. [16:37:33 WARN]: Incorrect key villager stuff.Allow armorers and weaponsmiths repair guard items when down below half durability? was corrected from null to its default, true. [16:37:33 WARN]: Incorrect key villager stuff.Make it so players have to have hero of the village to convert villagers into guards? was corrected from null to its default, false. [16:37:33 WARN]: Incorrect key villager stuff.Have it so blacksmiths heal golems under 60 health? was corrected from null to its default, true. [16:37:33 WARN]: Incorrect key villager stuff.Have it so clerics heal guards and players with hero of the village? was corrected from null to its default, true. [16:37:33 WARN]: Incorrect key villager stuff.Have Villagers have some common sense? was corrected from null to its default, true. [16:37:33 WARN]: Incorrect key golem stuff was corrected from null to its default, SimpleCommentedConfig:{}. [16:37:33 WARN]: Incorrect key golem stuff.Allow Iron Golems to float on water? was corrected from null to its default, true. [16:37:33 WARN]: Incorrect key guard stuff was corrected from null to its default, SimpleCommentedConfig:{}. [16:37:33 WARN]: Incorrect key guard stuff.Have guards patrol the village regularly? was corrected from null to its default, true. [16:37:33 WARN]: Incorrect key guard stuff.Chance to drop equipment was corrected from null to its default, 100.0. [16:37:33 WARN]: Incorrect key guard stuff.Have Guards have some common sense? was corrected from null to its default, false. [16:37:33 WARN]: Incorrect key guard stuff.Have Guards open doors? was corrected from null to its default, true. [16:37:33 WARN]: Incorrect key guard stuff.Have Guards raise their shield all the time? was corrected from null to its default, false. [16:37:33 WARN]: Incorrect key guard stuff.Have guards form a phalanx? was corrected from null to its default, true. [16:37:33 WARN]: Incorrect key guard stuff.Have guards attempt to avoid firing into other friendlies? was corrected from null to its default, true. [16:37:33 WARN]: Incorrect key guard stuff.Range was corrected from null to its default, 50.0. [16:37:33 WARN]: Incorrect key guard stuff.Guard health regeneration amount was corrected from null to its default, 1.0. [16:37:33 WARN]: Incorrect key guard stuff.Allow guard arrows to damage villagers, iron golems, or other guards? The i-frames will still be shown for them but they won't lose any health if this is set to false was corrected from null to its default, true. [16:37:33 WARN]: Incorrect key guard stuff.Allow players to give guards stuff only if they have the hero of the village effect? was corrected from null to its default, false. [16:37:33 WARN]: Incorrect key guard stuff.Allow players to set guard patrol points only if they have hero of the village was corrected from null to its default, false. [16:37:33 WARN]: Incorrect key guard stuff.Minimum reputation requirement for guards to give you access to their inventories was corrected from null to its default, 15. [16:37:33 WARN]: Incorrect key guard stuff.Guard health was corrected from null to its default, 20.0. [16:37:33 WARN]: Incorrect key guard stuff.Guard speed was corrected from null to its default, 0.5. [16:37:33 WARN]: Incorrect key guard stuff.Guard follow range was corrected from null to its default, 20.0. [16:37:33 WARN]: Incorrect key guard stuff.Have guards only follow the player if they have hero of the village? was corrected from null to its default, true. [16:37:33 WARN]: Incorrect key guard stuff.How low of a reputation of a player should have to be instantly aggroed upon by guards and golems? was corrected from null to its default, -100. [16:37:33 INFO] [Bookshelf]: Fixing MC-151457. Crafting remainder for minecraft:pufferfish_bucket is now minecraft:bucket. [16:37:33 INFO] [Bookshelf]: Fixing MC-151457. Crafting remainder for minecraft:salmon_bucket is now minecraft:bucket. [16:37:33 INFO] [Bookshelf]: Fixing MC-151457. Crafting remainder for minecraft:cod_bucket is now minecraft:bucket. [16:37:33 INFO] [Bookshelf]: Fixing MC-151457. Crafting remainder for minecraft:tropical_fish_bucket is now minecraft:bucket. [16:37:33 INFO] [Bookshelf]: Fixing MC-151457. Crafting remainder for minecraft:axolotl_bucket is now minecraft:bucket. [16:37:33 INFO] [Bookshelf]: Fixing MC-151457. Crafting remainder for minecraft:powder_snow_bucket is now minecraft:bucket. [16:37:33 INFO] [Bookshelf]: Fixing MC-151457. Crafting remainder for minecraft:tadpole_bucket is now minecraft:bucket. [16:37:33 ERROR]: Attempted to load class net/minecraft/client/gui/screens/Screen for invalid dist DEDICATED_SERVER [16:37:33 ERROR]: Failed to create mod instance. ModID: tweakerge, class fi.dy.masa.tweakeroo.Tweakeroo java.lang.RuntimeException: Attempted to load class net/minecraft/client/gui/screens/Screen for invalid dist DEDICATED_SERVER at net.minecraftforge.fml.loading.RuntimeDistCleaner.processClassWithFlags(RuntimeDistCleaner.java:57) ~[fmlloader-1.20.1-47.3.22.jar%23103!/:1.0] at cpw.mods.modlauncher.LaunchPluginHandler.offerClassNodeToPlugins(LaunchPluginHandler.java:88) ~[modlauncher-10.0.9.jar%2389!/:?] at cpw.mods.modlauncher.ClassTransformer.transform(ClassTransformer.java:120) ~[modlauncher-10.0.9.jar%2389!/:?] at cpw.mods.modlauncher.TransformingClassLoader.maybeTransformClassBytes(TransformingClassLoader.java:50) ~[modlauncher-10.0.9.jar%2389!/:?] at cpw.mods.cl.ModuleClassLoader.readerToClass(ModuleClassLoader.java:113) ~[securejarhandler-2.1.10.jar:?] at cpw.mods.cl.ModuleClassLoader.lambda$findClass$15(ModuleClassLoader.java:219) ~[securejarhandler-2.1.10.jar:?] at cpw.mods.cl.ModuleClassLoader.loadFromModule(ModuleClassLoader.java:229) ~[securejarhandler-2.1.10.jar:?] at cpw.mods.cl.ModuleClassLoader.findClass(ModuleClassLoader.java:219) ~[securejarhandler-2.1.10.jar:?] at cpw.mods.cl.ModuleClassLoader.loadClass(ModuleClassLoader.java:135) ~[securejarhandler-2.1.10.jar:?] at java.lang.ClassLoader.loadClass(ClassLoader.java:526) ~[?:?] at java.lang.Class.getDeclaredConstructors0(Native Method) ~[?:?] at java.lang.Class.privateGetDeclaredConstructors(Class.java:3549) ~[?:?] at java.lang.Class.getConstructor0(Class.java:3754) ~[?:?] at java.lang.Class.getDeclaredConstructor(Class.java:2930) ~[?:?] at net.minecraftforge.fml.javafmlmod.FMLModContainer.constructMod(FMLModContainer.java:73) ~[javafmllanguage-1.20.1-47.3.22.jar%23407!/:?] at net.minecraftforge.fml.ModContainer.lambda$buildTransitionHandler$4(ModContainer.java:124) ~[fmlcore-1.20.1-47.3.22.jar%23406!/:?] at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1804) ~[?:?] at java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1796) ~[?:?] at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387) ~[?:?] at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1312) ~[?:?] at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1843) ~[?:?] at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1808) ~[?:?] at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:188) ~[?:?] [16:37:33 INFO] [d.k.k.Konkrete]: [KONKRETE] Successfully initialized! [16:37:33 INFO] [d.k.k.Konkrete]: [KONKRETE] Server-side libs ready to use! [16:37:33 INFO] [d.k.m.Melody]: [MELODY] Disabling Melody since it's loaded server-side. [16:37:33 INFO] [i.u.u.u.v.JarSignVerifier]: Mod uteamcore is signed with a valid certificate. [16:37:33 ERROR]: Failed to create mod instance. ModID: embeddium, class me.jellysquid.mods.sodium.client.SodiumClientMod java.lang.NoClassDefFoundError: net/minecraft/client/GraphicsStatus at java.lang.Class.getDeclaredMethods0(Native Method) ~[?:?] at java.lang.Class.privateGetDeclaredMethods(Class.java:3578) ~[?:?] at java.lang.Class.getMethodsRecursive(Class.java:3719) ~[?:?] at java.lang.Class.getMethod0(Class.java:3705) ~[?:?] at java.lang.Class.getMethod(Class.java:2393) ~[?:?] at java.lang.Class.getEnumConstantsShared(Class.java:4005) ~[?:?] at java.lang.Class.getEnumConstants(Class.java:3989) ~[?:?] at io.izzel.arclight.boot.EnumTypeFactory$EnumTypeAdapter.<init>(EnumTypeFactory.java:39) ~[arclight-forge-1.20.1.jar%2383!/:arclight-1.20.1-1.0.6-4e94eb76] at io.izzel.arclight.boot.EnumTypeFactory.create(EnumTypeFactory.java:30) ~[arclight-forge-1.20.1.jar%2383!/:arclight-1.20.1-1.0.6-4e94eb76] at com.google.gson.Gson.getAdapter(Gson.java:546) ~[gson-2.10.jar%23106!/:?] at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:160) ~[gson-2.10.jar%23106!/:?] at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:295) ~[gson-2.10.jar%23106!/:?] at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:130) ~[gson-2.10.jar%23106!/:?] at com.google.gson.Gson.getAdapter(Gson.java:546) ~[gson-2.10.jar%23106!/:?] at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:160) ~[gson-2.10.jar%23106!/:?] at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:295) ~[gson-2.10.jar%23106!/:?] at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:130) ~[gson-2.10.jar%23106!/:?] at com.google.gson.Gson.getAdapter(Gson.java:546) ~[gson-2.10.jar%23106!/:?] at com.google.gson.Gson.toJson(Gson.java:817) ~[gson-2.10.jar%23106!/:?] at com.google.gson.Gson.toJson(Gson.java:795) ~[gson-2.10.jar%23106!/:?] at com.google.gson.Gson.toJson(Gson.java:742) ~[gson-2.10.jar%23106!/:?] at com.google.gson.Gson.toJson(Gson.java:719) ~[gson-2.10.jar%23106!/:?] at me.jellysquid.mods.sodium.client.gui.SodiumGameOptions.writeToDisk(SodiumGameOptions.java:169) ~[embeddium-0.3.14+mc1.20.1.jar%23331!/:?] at me.jellysquid.mods.sodium.client.gui.SodiumGameOptions.writeChanges(SodiumGameOptions.java:149) ~[embeddium-0.3.14+mc1.20.1.jar%23331!/:?] at me.jellysquid.mods.sodium.client.gui.SodiumGameOptions.load(SodiumGameOptions.java:135) ~[embeddium-0.3.14+mc1.20.1.jar%23331!/:?] at me.jellysquid.mods.sodium.client.gui.SodiumGameOptions.load(SodiumGameOptions.java:106) ~[embeddium-0.3.14+mc1.20.1.jar%23331!/:?] at me.jellysquid.mods.sodium.client.SodiumClientMod.loadConfig(SodiumClientMod.java:69) ~[embeddium-0.3.14+mc1.20.1.jar%23331!/:?] at me.jellysquid.mods.sodium.client.SodiumClientMod.<clinit>(SodiumClientMod.java:28) ~[embeddium-0.3.14+mc1.20.1.jar%23331!/:?] at jdk.internal.misc.Unsafe.ensureClassInitialized0(Native Method) ~[?:?] at jdk.internal.misc.Unsafe.ensureClassInitialized(Unsafe.java:1160) ~[?:?] at jdk.internal.reflect.MethodHandleAccessorFactory.ensureClassInitialized(MethodHandleAccessorFactory.java:300) ~[?:?] at jdk.internal.reflect.MethodHandleAccessorFactory.newConstructorAccessor(MethodHandleAccessorFactory.java:103) ~[?:?] at jdk.internal.reflect.ReflectionFactory.newConstructorAccessor(ReflectionFactory.java:200) ~[?:?] at java.lang.reflect.Constructor.acquireConstructorAccessor(Constructor.java:549) ~[?:?] at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[?:?] at java.lang.reflect.Constructor.newInstance(Constructor.java:486) ~[?:?] at net.minecraftforge.fml.javafmlmod.FMLModContainer.constructMod(FMLModContainer.java:77) ~[javafmllanguage-1.20.1-47.3.22.jar%23407!/:?] at net.minecraftforge.fml.ModContainer.lambda$buildTransitionHandler$4(ModContainer.java:124) ~[fmlcore-1.20.1-47.3.22.jar%23406!/:?] at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1804) ~[?:?] at java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1796) ~[?:?] at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387) ~[?:?] at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1312) ~[?:?] at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1843) ~[?:?] at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1808) ~[?:?] at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:188) ~[?:?] Caused by: java.lang.ClassNotFoundException: net.minecraft.client.GraphicsStatus at cpw.mods.cl.ModuleClassLoader.loadClass(ModuleClassLoader.java:141) ~[securejarhandler-2.1.10.jar:?] at java.lang.ClassLoader.loadClass(ClassLoader.java:526) ~[?:?] ... 45 more [LSP CoreMod] Patched: UUIDUtil.createOfflinePlayerUUID(String) [16:37:34 ERROR]: Failed to create mod instance. ModID: entity_texture_features, class traben.entity_texture_features.forge.ETFClientForge java.lang.UnsupportedOperationException: Attempting to load a clientside only mod on the server, refusing at traben.entity_texture_features.forge.ETFClientForge.<init>(ETFClientForge.java:37) ~[%5B实体纹理特性%5D%20entity_texture_features_forge_1.20.1-6.2.4.jar%23286!/:?] at jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62) ~[?:?] at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502) ~[?:?] at java.lang.reflect.Constructor.newInstance(Constructor.java:486) ~[?:?] at net.minecraftforge.fml.javafmlmod.FMLModContainer.constructMod(FMLModContainer.java:77) ~[javafmllanguage-1.20.1-47.3.22.jar%23407!/:?] at net.minecraftforge.fml.ModContainer.lambda$buildTransitionHandler$4(ModContainer.java:124) ~[fmlcore-1.20.1-47.3.22.jar%23406!/:?] at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1804) ~[?:?] at java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1796) ~[?:?] at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387) ~[?:?] at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1312) ~[?:?] at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1843) ~[?:?] at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1808) ~[?:?] at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:188) ~[?:?] [16:37:34 ERROR]: Attempted to load class net/minecraft/client/gui/screens/Screen for invalid dist DEDICATED_SERVER [16:37:34 ERROR]: Failed to create mod instance. ModID: mafglib, class fi.dy.masa.malilib.MaLiLib java.lang.RuntimeException: Attempted to load class net/minecraft/client/gui/screens/Screen for invalid dist DEDICATED_SERVER at net.minecraftforge.fml.loading.RuntimeDistCleaner.processClassWithFlags(RuntimeDistCleaner.java:57) ~[fmlloader-1.20.1-47.3.22.jar%23103!/:1.0] at cpw.mods.modlauncher.LaunchPluginHandler.offerClassNodeToPlugins(LaunchPluginHandler.java:88) ~[modlauncher-10.0.9.jar%2389!/:?] at cpw.mods.modlauncher.ClassTransformer.transform(ClassTransformer.java:120) ~[modlauncher-10.0.9.jar%2389!/:?] at cpw.mods.modlauncher.TransformingClassLoader.maybeTransformClassBytes(TransformingClassLoader.java:50) ~[modlauncher-10.0.9.jar%2389!/:?] at cpw.mods.cl.ModuleClassLoader.readerToClass(ModuleClassLoader.java:113) ~[securejarhandler-2.1.10.jar:?] at cpw.mods.cl.ModuleClassLoader.lambda$findClass$15(ModuleClassLoader.java:219) ~[securejarhandler-2.1.10.jar:?] at cpw.mods.cl.ModuleClassLoader.loadFromModule(ModuleClassLoader.java:229) ~[securejarhandler-2.1.10.jar:?] at cpw.mods.cl.ModuleClassLoader.findClass(ModuleClassLoader.java:219) ~[securejarhandler-2.1.10.jar:?] at cpw.mods.cl.ModuleClassLoader.loadClass(ModuleClassLoader.java:135) ~[securejarhandler-2.1.10.jar:?] at java.lang.ClassLoader.loadClass(ClassLoader.java:526) ~[?:?] at java.lang.Class.getDeclaredConstructors0(Native Method) ~[?:?] at java.lang.Class.privateGetDeclaredConstructors(Class.java:3549) ~[?:?] at java.lang.Class.getConstructor0(Class.java:3754) ~[?:?] at java.lang.Class.getDeclaredConstructor(Class.java:2930) ~[?:?] at net.minecraftforge.fml.javafmlmod.FMLModContainer.constructMod(FMLModContainer.java:73) ~[javafmllanguage-1.20.1-47.3.22.jar%23407!/:?] at net.minecraftforge.fml.ModContainer.lambda$buildTransitionHandler$4(ModContainer.java:124) ~[fmlcore-1.20.1-47.3.22.jar%23406!/:?] at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1804) ~[?:?] at java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1796) ~[?:?] at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387) ~[?:?] at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1312) ~[?:?] at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1843) ~[?:?] at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1808) ~[?:?] at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:188) ~[?:?] [16:37:34 ERROR]: Attempted to load class net/minecraft/client/gui/screens/Screen for invalid dist DEDICATED_SERVER [16:37:34 ERROR]: Failed to create mod instance. ModID: oculus, class net.coderbot.iris.Iris java.lang.RuntimeException: Attempted to load class net/minecraft/client/gui/screens/Screen for invalid dist DEDICATED_SERVER at net.minecraftforge.fml.loading.RuntimeDistCleaner.processClassWithFlags(RuntimeDistCleaner.java:57) ~[fmlloader-1.20.1-47.3.22.jar%23103!/:1.0] at cpw.mods.modlauncher.LaunchPluginHandler.offerClassNodeToPlugins(LaunchPluginHandler.java:88) ~[modlauncher-10.0.9.jar%2389!/:?] at cpw.mods.modlauncher.ClassTransformer.transform(ClassTransformer.java:120) ~[modlauncher-10.0.9.jar%2389!/:?] at cpw.mods.modlauncher.TransformingClassLoader.maybeTransformClassBytes(TransformingClassLoader.java:50) ~[modlauncher-10.0.9.jar%2389!/:?] at cpw.mods.cl.ModuleClassLoader.readerToClass(ModuleClassLoader.java:113) ~[securejarhandler-2.1.10.jar:?] at cpw.mods.cl.ModuleClassLoader.lambda$findClass$15(ModuleClassLoader.java:219) ~[securejarhandler-2.1.10.jar:?] at cpw.mods.cl.ModuleClassLoader.loadFromModule(ModuleClassLoader.java:229) ~[securejarhandler-2.1.10.jar:?] at cpw.mods.cl.ModuleClassLoader.findClass(ModuleClassLoader.java:219) ~[securejarhandler-2.1.10.jar:?] at cpw.mods.cl.ModuleClassLoader.loadClass(ModuleClassLoader.java:135) ~[securejarhandler-2.1.10.jar:?] at java.lang.ClassLoader.loadClass(ClassLoader.java:526) ~[?:?] at java.lang.Class.getDeclaredConstructors0(Native Method) ~[?:?] at java.lang.Class.privateGetDeclaredConstructors(Class.java:3549) ~[?:?] at java.lang.Class.getConstructor0(Class.java:3754) ~[?:?] at java.lang.Class.getDeclaredConstructor(Class.java:2930) ~[?:?] at net.minecraftforge.fml.javafmlmod.FMLModContainer.constructMod(FMLModContainer.java:73) ~[javafmllanguage-1.20.1-47.3.22.jar%23407!/:?] at net.minecraftforge.fml.ModContainer.lambda$buildTransitionHandler$4(ModContainer.java:124) ~[fmlcore-1.20.1-47.3.22.jar%23406!/:?] at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1804) ~[?:?] at java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1796) ~[?:?] at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387) ~[?:?] at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1312) ~[?:?] at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1843) ~[?:?] at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1808) ~[?:?] at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:188) ~[?:?] [16:37:34 INFO] [Collective]: Loading Collective version 7.84. [16:37:34 INFO] [c.a.a.AdvancedNetherite]: Initializing platform helper for Advanced Netherite! [16:37:34 INFO] [betterstrongholds]: Creating directory for additional Better Strongholds configuration at /home/steam/games/arclight-forge-1.20.1/config/betterstrongholds/forge-1_20 [16:37:34 INFO] [Spartan Weaponry]: Constructing Mod: Spartan Weaponry [16:37:34 INFO] [Spartan Weaponry]: Initialising API! Version: 11 [16:37:34 INFO] [Spartan Weaponry]: Spartan Weaponry API version 11 has been initalized! [16:37:36 INFO] [d.a.n.f.NetworkManagerImpl]: Registering C2S receiver with id architectury:sync_ids [16:37:36 INFO] [Void Totem]: Loading up Void Totem (Forge) [16:37:36 WARN] [i.u.u.u.v.JarSignVerifier]: --------------------------------------------------------------------------------- [16:37:36 WARN] [i.u.u.u.v.JarSignVerifier]: Mod attackspeedenchantment is not signed with a valid certificate but should be signed. [16:37:36 WARN] [i.u.u.u.v.JarSignVerifier]: Please download the mod only from trusted sources such as curseforge.com! [16:37:36 WARN] [i.u.u.u.v.JarSignVerifier]: --------------------------------------------------------------------------------- [16:37:36 INFO] [Inventory Profiles Next]: [Inventory Profiles Next] Inventory Profiles Next - init in Kotlin [16:37:37 INFO] [Puzzles Lib]: Constructing common components for mutantmonsters:main [16:37:38 INFO]: Forge mod loading, version 47.3.22, for MC 1.20.1 with MCP 20230612.114412 [16:37:38 INFO]: MinecraftForge v47.3.22 Initialized [16:37:38 INFO] [libIPN]: [libIPN] libIPN - init in Kotlin [16:37:38 INFO] [graveyard]: Registered JSON trade offer adapter. [Mouse Tweaks] Disabled because not running on the client. [16:37:38 INFO] [t.k.t.KotlinForForge]: Kotlin For Forge Enabled! [16:37:39 INFO] [ImmediatelyFast]: Loading ImmediatelyFast 1.2.3+1.20.1 [16:37:39 INFO] [ImmediatelyFast]: Found Oculus 1.6.15a. Enabling compatibility. [16:37:39 ERROR]: Attempted to load class com/mojang/blaze3d/vertex/VertexFormat$Mode for invalid dist DEDICATED_SERVER [16:37:39 ERROR] [ImmediatelyFast]: Failed to initialize Iris compatibility. Try updating Iris and ImmediatelyFast before reporting this on GitHub java.lang.RuntimeException: Attempted to load class com/mojang/blaze3d/vertex/VertexFormat$Mode for invalid dist DEDICATED_SERVER at net.minecraftforge.fml.loading.RuntimeDistCleaner.processClassWithFlags(RuntimeDistCleaner.java:57) ~[fmlloader-1.20.1-47.3.22.jar%23103!/:1.0] at cpw.mods.modlauncher.LaunchPluginHandler.offerClassNodeToPlugins(LaunchPluginHandler.java:88) ~[modlauncher-10.0.9.jar%2389!/:?] at cpw.mods.modlauncher.ClassTransformer.transform(ClassTransformer.java:120) ~[modlauncher-10.0.9.jar%2389!/:?] at cpw.mods.modlauncher.TransformingClassLoader.maybeTransformClassBytes(TransformingClassLoader.java:50) ~[modlauncher-10.0.9.jar%2389!/:?] at cpw.mods.cl.ModuleClassLoader.readerToClass(ModuleClassLoader.java:113) ~[securejarhandler-2.1.10.jar:?] at cpw.mods.cl.ModuleClassLoader.lambda$findClass$15(ModuleClassLoader.java:219) ~[securejarhandler-2.1.10.jar:?] at cpw.mods.cl.ModuleClassLoader.loadFromModule(ModuleClassLoader.java:229) ~[securejarhandler-2.1.10.jar:?] at cpw.mods.cl.ModuleClassLoader.findClass(ModuleClassLoader.java:219) ~[securejarhandler-2.1.10.jar:?] at cpw.mods.cl.ModuleClassLoader.loadClass(ModuleClassLoader.java:135) ~[securejarhandler-2.1.10.jar:?] at java.lang.ClassLoader.loadClass(ClassLoader.java:526) ~[?:?] at forge.net.raphimc.immediatelyfast.compat.IrisCompat.init(IrisCompat.java:47) ~[ImmediatelyFast-1.2.3+1.20.1.jar%23349!/:?] at forge.net.raphimc.immediatelyfast.forge.ImmediatelyFastForge.lambda$new$0(ImmediatelyFastForge.java:34) ~[ImmediatelyFast-1.2.3+1.20.1.jar%23349!/:?] at java.util.Optional.ifPresent(Optional.java:178) ~[?:?] at forge.net.raphimc.immediatelyfast.forge.ImmediatelyFastForge.<init>(ImmediatelyFastForge.java:32) ~[ImmediatelyFast-1.2.3+1.20.1.jar%23349!/:?] at jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62) ~[?:?] at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502) ~[?:?] at java.lang.reflect.Constructor.newInstance(Constructor.java:486) ~[?:?] at net.minecraftforge.fml.javafmlmod.FMLModContainer.constructMod(FMLModContainer.java:77) ~[javafmllanguage-1.20.1-47.3.22.jar%23407!/:?] at net.minecraftforge.fml.ModContainer.lambda$buildTransitionHandler$4(ModContainer.java:124) ~[fmlcore-1.20.1-47.3.22.jar%23406!/:?] at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1804) ~[?:?] at java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1796) ~[?:?] at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387) ~[?:?] at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1312) ~[?:?] at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1843) ~[?:?] at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1808) ~[?:?] at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:188) ~[?:?] [16:37:39 INFO] [d.k.f.FancyMenu]: [FANCYMENU] Loading v3.1.5 in server-side mode on FORGE! root@C202509151846323:/home/steam/games/arclight-forge-1.20.1#
09-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值