【问题标题】:Unable to find Clojure找不到 Clojure
【发布时间】:2012-06-30 16:20:53
【问题描述】:

编辑:在the Bukkit forumson Github 上还有一些与此问题相关的其他讨论。

所以,我知道有一两个人尝试过,但没有运气。但我想我快到了。

一个问题:我不懂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)

然后我将它手动放入 jar 中,在 com/gdude2002/ClojurePlugin/mainclj.class 下(以及将 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,对吧?”所以,我把clojure jar放在各种地方,同样的错误。我还将 META-INF/MANIFEST.MF 添加到 jar 中,其中包含 Class-Path: ../lib。还是什么都没有。

所以,我认为我很聪明,我将 clojure 文件夹从 Clojure jar 中拉出并推入我的,同时将文件夹放在 ../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 */ }
}

编辑:在 cmets 中提到我应该发布我的 project.clj 文件。问题是,我没有!我直接在 mainclj.clj 上运行 compile.clj,并手动创建一个 jarfile。

在这一点上,我完全被难住了。有人对此有任何想法吗?

【问题讨论】:

  • 这听起来像是您的 project.clj 文件中缺少某些内容?你会编辑你的原始问题,并将你的 project.clj 文件和你的 core.clj 文件的头部(或你的 Clojure 代码所在的源文件的名称)粘贴在帖子中吗?你用什么来建造?我推荐 leiningen github.com/technomancy/leiningen
  • 此时我什至没有 project.clj 文件。源文件是 mainclj.clj(上面的第一个代码块),我使用上面的小两行代码将其编译为标准 Java 类。我手动打包 jar,就好像它是一个 zip 文件一样。请注意,打包后的 jar 中没有 Clojure 代码,只有我编译的类。
  • 看这里,这可能对你有帮助。 stackoverflow.com/questions/9167993/…我尝试构建一个留置权项目,并得到了同样的错误,所以我提供的链接可能会让你更进一步。
  • 在刚刚删除他们评论的人那里:是的,所有的源代码都在那里,尽管如果你愿意,我可以发布 .class 文件的反编译。我正在尝试为 Bukkit(可以通过 Java 插件扩展的 Minecraft 服务器)编写一个插件。
  • @octopusgrabbus 谢谢,我现在正在查看它。编辑:是的,我实际上曾经遇到过同样的问题,我不得不从 gen-class 函数中删除 :methods 来修复它

标签: java clojure bukkit


【解决方案1】:

我通过配置调用代码的类加载器解决了这个问题,如in this post所述。

我的情况可能与调用 Java 代码时有所不同。 换句话说,我在从使用 gen-class (Clojure) 创建的类中调用方法之前,立即在我的 CommandExecutor (Java) 中调用了该代码。

【讨论】:

    猜你喜欢
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多