5

編集: Bukkit フォーラムGithubで、この質問に関連する他の議論が進行中です。

だから、私は 1 人か 2 人がこれを試みたが運が悪かったことを知っています..しかし、私はほとんどそこにいると思います.

1 つの問題: 私は Java を知らないので、これは私には少し異質です。ともかく..

そこで、次のように Clojure で簡単なクラスを作成しました。

(ns com.gdude2002.ClojurePlugin.mainclj
  (:gen-class
   :name com.gdude2002.ClojurePlugin.mainclj
   :extends org.bukkit.plugin.java.JavaPlugin)
  (:import org.bukkit.plugin.java.JavaPlugin))

(defn -onEnable [this] (java.util.logging.Logger/getLogger "Loaded clojure plugin!"))
(defn -onDisable [this] (java.util.logging.Logger/getLogger "Unloaded clojure plugin!"))

次のように、clojure のcompile関数を使用して、これを Java クラスにコンパイルします。

(set! *compile-path* ".")
(compile 'com.gdude2002.ClojurePlugin.mainclj)

次に、手動で com/gdude2002/ClojurePlugin/mainclj.class の下の jar に入れます (また、ルートに plugin.yml を入れます)。

ここまでは順調ですね。このメソッドは、(特に) 私のコードについて bukkit ビッチを作っているわけではありません。これは良いことだと思います。さて、問題に進みます。

この手作りの jar でサーバーを起動しようとすると、次の出力が得られます。

21:43:30 [SEVERE] Could not load 'plugins\plugin.jar' in folder 'plugins'
org.bukkit.plugin.InvalidPluginException: java.lang.NoClassDefFoundError: clojure/lang/IFn

「それで、それは簡単に思えます。Clojure を見つけることができませんよね?」だから、私はクロージュアの瓶をあらゆる場所に置きましたが、同じエラーが発生しました。META-INF/MANIFEST.MF も jar に追加し、Class-Path: ../lib. まだ何もありません。

それで、私は頭がいいと思って、Clojure jar から clojure フォルダーを取り出して自分のフォルダーに押し込み、フォルダーを ../lib と、それが役立つと思われる他の場所にも入れました。

今、私はこのエラーが発生します..

21:51:33 [SEVERE] Could not load 'plugins\plugin.jar' in folder 'plugins'
org.bukkit.plugin.InvalidPluginException: java.lang.ExceptionInInitializerError
...
Caused by: java.io.FileNotFoundException: Could not locate clojure/core__init.class or clojure/core.clj on classpath:
...

問題は、私が見る限り、それらの両方が存在するということです..

編集: 誰にでも役立つ場合に備えて、ここで逆コンパイルされたクラス コードを表示することにしました。

// IntelliJ API Decompiler stub source generated from a class file
// Implementation of methods is not available

package com.gdude2002.ClojurePlugin;

public class mainclj extends org.bukkit.plugin.java.JavaPlugin {
    private static final clojure.lang.Var main__var;
    private static final clojure.lang.Var onEnable__var;
    private static final clojure.lang.Var getResource__var;
    private static final clojure.lang.Var onLoad__var;
    private static final clojure.lang.Var getLogger__var;
    private static final clojure.lang.Var saveDefaultConfig__var;
    private static final clojure.lang.Var getDescription__var;
    private static final clojure.lang.Var removeDDL__var;
    private static final clojure.lang.Var onDisable__var;
    private static final clojure.lang.Var isInitialized__var;
    private static final clojure.lang.Var saveResource__var;
    private static final clojure.lang.Var onCommand__var;
    private static final clojure.lang.Var getDefaultWorldGenerator__var;
    private static final clojure.lang.Var toString__var;
    private static final clojure.lang.Var getDataFolder__var;
    private static final clojure.lang.Var installDDL__var;
    private static final clojure.lang.Var getDatabase__var;
    private static final clojure.lang.Var getFile__var;
    private static final clojure.lang.Var getClassLoader__var;
    private static final clojure.lang.Var getCommand__var;
    private static final clojure.lang.Var getDatabaseClasses__var;
    private static final clojure.lang.Var getConfig__var;
    private static final clojure.lang.Var reloadConfig__var;
    private static final clojure.lang.Var clone__var;
    private static final clojure.lang.Var setEnabled__var;
    private static final clojure.lang.Var saveConfig__var;

    public mainclj() { /* compiled code */ }

    public java.io.File getDataFolder() { /* compiled code */ }

    public boolean onCommand(org.bukkit.command.CommandSender p0, org.bukkit.command.Command p1, java.lang.String p2, java.lang.String[] p3) { /* compiled code */ }

    public void reloadConfig() { /* compiled code */ }

    public org.bukkit.configuration.file.FileConfiguration getConfig() { /* compiled code */ }

    public java.io.File getFile() { /* compiled code */ }

    public void saveConfig() { /* compiled code */ }

    public org.bukkit.command.PluginCommand getCommand(java.lang.String p0) { /* compiled code */ }

    public void onEnable() { /* compiled code */ }

    public java.util.logging.Logger getLogger() { /* compiled code */ }

    public void onLoad() { /* compiled code */ }

    public java.lang.ClassLoader getClassLoader() { /* compiled code */ }

    public void saveDefaultConfig() { /* compiled code */ }

    public org.bukkit.plugin.PluginDescriptionFile getDescription() { /* compiled code */ }

    public com.avaje.ebean.EbeanServer getDatabase() { /* compiled code */ }

    public void removeDDL() { /* compiled code */ }

    public void onDisable() { /* compiled code */ }

    public boolean isInitialized() { /* compiled code */ }

    public org.bukkit.generator.ChunkGenerator getDefaultWorldGenerator(java.lang.String p0, java.lang.String p1) { /* compiled code */ }

    public void installDDL() { /* compiled code */ }

    public void saveResource(java.lang.String p0, boolean p1) { /* compiled code */ }

    public java.util.List getDatabaseClasses() { /* compiled code */ }

    public java.lang.String toString() { /* compiled code */ }

    public java.lang.Object clone() { /* compiled code */ }

    public void setEnabled(boolean p0) { /* compiled code */ }

    public java.io.InputStream getResource(java.lang.String p0) { /* compiled code */ }

    public static void main(java.lang.String[] p0) { /* compiled code */ }
}

編集: project.clj ファイルを投稿する必要があることがコメントに記載されていました。事は、私はそれを持っていないということです!mainclj.clj で compile.clj を直接実行し、手動で jarfile を作成しています。

この時点で、私は完全に困惑しています。誰かがこれについて何か考えを持っていますか?

4

1 に答える 1

1

この投稿 で説明されているように、呼び出し元のコードのクラスローダーを構成することで、この問題を解決しました。

私の状況は、呼び出し元の Java コードとは少し異なる可能性があります。つまり、gen-class (Clojure) を使用して作成されたクラスからメソッドを呼び出す直前に、CommandExecutor (Java) でそのコードを呼び出しました。

于 2012-12-13T15:24:59.553 に答える