首页 > 解决方案 > 无法将 ND4j 遮蔽到罐子中

问题描述

所以,我一直在尝试将 deeplearning4j(DL4j) 集成到我的 Minecraft 插件中,到目前为止进展顺利。我唯一的问题是遮蔽到罐子里。我成功地在其中隐藏了 dl4j,但似乎无法将 nd4j 放入其中,这是 dl4j 工作所需的库。任何帮助或建议将不胜感激。我也尝试过 Maven-assembly,但没有奏效。

错误:

[10:54:34] [Server thread/ERROR]: Error occurred while enabling AIAC  v1.0 (Is it up to date?)
java.lang.ExceptionInInitializerError
   at org.datavec.api.util.ndarray.RecordConverter.toMinibatchArray(RecordConverter.java:198) ~[?:?]
   at org.deeplearning4j.datasets.datavec.RecordReaderMultiDataSetIterator.next(RecordReaderMultiDataSetIterator.java:160) ~[?:?]
   at org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator.next(RecordReaderDataSetIterator.java:377) ~[?:?]
   at org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator.next(RecordReaderDataSetIterator.java:452) ~[?:?]
   at org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator.next(RecordReaderDataSetIterator.java:85) ~[?:?]
   at org.derock_antony.aiac.ai.Loader.<init>(Loader.java:35) ~[?:?]
   at org.derock_antony.aiac.Main.onEnable(Main.java:25) ~[?:?]
   at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:321) ~[spigot.jar:git-Spigot-db6de12-18fbb24]
   at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:340) [spigot.jar:git-Spigot-db6de12-18fbb24]
   at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:405) [spigot.jar:git-Spigot-db6de12-18fbb24]
   at org.bukkit.craftbukkit.v1_8_R3.CraftServer.loadPlugin(CraftServer.java:357) [spigot.jar:git-Spigot-db6de12-18fbb24]
   at org.bukkit.craftbukkit.v1_8_R3.CraftServer.enablePlugins(CraftServer.java:317) [spigot.jar:git-Spigot-db6de12-18fbb24]
   at net.minecraft.server.v1_8_R3.MinecraftServer.s(MinecraftServer.java:414) [spigot.jar:git-Spigot-db6de12-18fbb24]
   at net.minecraft.server.v1_8_R3.MinecraftServer.k(MinecraftServer.java:378) [spigot.jar:git-Spigot-db6de12-18fbb24]
   at net.minecraft.server.v1_8_R3.MinecraftServer.a(MinecraftServer.java:333) [spigot.jar:git-Spigot-db6de12-18fbb24]
   at net.minecraft.server.v1_8_R3.DedicatedServer.init(DedicatedServer.java:263) [spigot.jar:git-Spigot-db6de12-18fbb24]
   at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:525) [spigot.jar:git-Spigot-db6de12-18fbb24]
   at java.lang.Thread.run(Unknown Source) [?:1.8.0_201]
Caused by: java.lang.RuntimeException: org.nd4j.linalg.factory.Nd4jBackend$NoAvailableBackendException: Please ensure that you have an nd4j backend on your classpath. Please see: http://nd4j.org/getstarted.html
   at org.nd4j.linalg.factory.Nd4j.initContext(Nd4j.java:5131) ~[?:?]
   at org.nd4j.linalg.factory.Nd4j.<clinit>(Nd4j.java:226) ~[?:?]
   ... 18 more
Caused by: org.nd4j.linalg.factory.Nd4jBackend$NoAvailableBackendException: Please ensure that you have an nd4j backend on your classpath. Please see: http://nd4j.org/getstarted.html
   at org.nd4j.linalg.factory.Nd4jBackend.load(Nd4jBackend.java:218) ~[?:?]
   at org.nd4j.linalg.factory.Nd4j.initContext(Nd4j.java:5128) ~[?:?]
   at org.nd4j.linalg.factory.Nd4j.<clinit>(Nd4j.java:226) ~[?:?]
   ... 18 more

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>me.antony.aiac</groupId>
    <artifactId>aiac</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.release>12</maven.compiler.release>
    </properties>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>org.derock_antony.aiac.Main</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>8</release>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <artifactSet>
                                <excludes>
                                </excludes>
                            </artifactSet>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.deeplearning4j</groupId>
            <artifactId>deeplearning4j-core</artifactId>
            <version>1.0.0-beta6</version>
        </dependency>
        <dependency>
            <groupId>org.nd4j</groupId>
            <artifactId>nd4j-native-platform</artifactId>
            <version>1.0.0-beta6</version>
        </dependency>
    </dependencies>
</project>

标签: javadeep-learningbukkitmaven-shade-plugin

解决方案


我设法通过更改库(nd4j)以不使用 Java 的 ServiceLoader 功能来解决这个问题(我遇到的不是 Minecraft Mod,而是 Slay The Spire mod)。

nd4j 库抛出的错误仅在找不到后端时才会抛出(它只尝试使用名为 ServiceLoaders 的 java 功能来实现,表面上它不能很好地与 modded minecraft 和 modded 完成的自定义类加载一起工作杀死尖顶)。

因此,只需更改库本身以对使用 ServiceLoaders 查找的内容进行硬编码即可解决问题。我不认为这是一个很好的解决方案,但考虑到修改后的 minecraft 发射器或修改后的 slay 尖顶发射器不太可能解决此问题,这是为您自己的 mod 修复它的一种方法。


推荐阅读