当前位置: 首页 > 知识库问答 >
问题:

使用库的Java项目在使用使用相同库的项目时抛出NoClassDefFoundError

徐高韵
2023-03-14

我正在创建一个Java库,用于其他Java项目。这些项目使用Repast Symphony,我的库也使用Repast Symphony(所以我担心这个错误是由一些冲突引起的)。一切都很好,但当我运行Repast模拟时,它抛出了java。lang.NoClassDefFoundError:repast/simphony/context/context

我尝试将我的库导出为jar,直接导入项目并将库添加到项目的类路径,但没有成功。我做错了什么?

这个上下文类正在我的库和项目中使用。以下是它在两个类中的使用片段:

// MyContextBulder.java
// This file is in my project
// This class is called by Repast first
import repast.simphony.context.Context;
import repast.simphony.dataLoader.ContextBuilder;
import mylibrary.core.DF;
import mylibrary.core.DF.MyContext;

public class MyContextBuilder implements ContextBuilder<Object> {

    @Override
    public Context<Object> build(Context<Object> context) {

        context.setId("test");
        DF.setContext((MyContext) context);

        // Create agent
        new MyAgent();
        // Add the agent to the Repast context.
        // context.add(t);

        return context;
    }
}
// DF.java
// This file is in my library

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;

import org.apache.commons.collections15.Predicate;

import repast.simphony.context.Context;
import repast.simphony.context.ContextListener;
import repast.simphony.space.projection.Projection;
import repast.simphony.util.collections.IndexedIterable;
import repast.simphony.valueLayer.ValueLayer;
import mylibrary.Agent;


/**
 * This static class provides the Directory Facilitator Service
 * and is used to send messages to agents
 * and to keep a directory of all agents in the application.
 * Agents use the static method send(ACLMessage) to send a message
 * to one or more agents. The ACLMessage object contains
 * the receiver agent and the sender (so the receiver can reply back).
 * 
 * This class needs to be setup initially before registering new agents.
 * To do that, simply call setContext(...);
 * @author joaolopes
 *
 */
public class DF {

    private static int lastAID = 0; // Just to help generate new identifiers
    private static HashMap<Integer, Agent> agents; // Contains all agents

    /**
     * The Repast context that contains all
     * scheduled Repast objects.
     */
    private static MyContext context = null;

    /**
     * Registers the agent in the directory and returns its
     * AID (freshly generated for it). If the agent is already
     * registered, returns its current AID.
     * @param agent The agent to be registered
     * @return The AID generated for the agent.
     */
    public static int registerAgent(Agent agent) {
        // If this agent is already in the hashMap,
        // just return its key.
        if (getAgents().containsValue(agent)) {
            return agent.getAID();
        }

        // Quick way to find a new ID for this agent
        // that is not in use at the moment.
        while (getAgents().containsKey(lastAID)) {
            lastAID++;
        }

        // The agent must know their own ID.
        agent.setAID(lastAID);
        agents.put(lastAID, agent);
        System.err.println(context.toString());
        context.add(agent);
        return lastAID;
    }

    public static void setContext(MyContext c){
        context = c;
    }
}

编辑以从评论中添加相关信息:我不会像在我的库中那样直接在我的项目中导入reast JAR。Repast Symphony作为插件安装在Eclipse中,因此我创建了包含所有Repast库的“Repast Projects”。因此,我无法删除导致可能的类冲突的特定JAR。

共有2个答案

居琛
2023-03-14

java.lang.NoClassDefFoundError在JVM尝试运行应用程序时被抛出。典型的情况是当你得到一个jar文件作为"接口"。然后你得到了实现该接口的其他jar文件。

因此,您需要做的是,将Repast jar放在jars类路径中。这样你的程序就可以找到你想要使用的正确类。

秦时铭
2023-03-14

正如你所说的。这个错误应该是jar中相同类之间的冲突。如果您使用的是IDE,请尝试清理构建并再次重建。

我还建议你只使用一个symphony library罐子。多个类定义总是导致JVM类加载器不明确。

尽量不要在导入项目中使用symphony jar,因为导出的jar中已经有了symphony jar。导入库之后,应该没有错误。

试试这个,告诉我进展如何。

我建议您使用构建工具。类似Maven的东西。然后带有正确插件的maven将为您解决这个问题。您需要做的就是告诉Maven您需要一个特定的jar文件。然后一个魔术就会发生,您将有一个工作良好的jar文件要分发

 类似资料:
  • 使用本主题了解如何在 Dreamweaver 中创建库项目以及在文档中插入和编辑库项目。 库是一种特殊的 Dreamweaver 文件,其中包含可放置到网页中的一组单个资源或资源副本。库中的这些资源称为库项目。可在库中存储的项目包括图像、表格、声音和使用 Adobe Flash 创建的文件。每当编辑某个库项目时,可以自动更新所有使用该项目的页面。 例如,假设您正在为某公司创建一个大型站点,公司希望

  • 我找到了一个符合我目的的图书馆,但它是写在Kotlin上的。我可以在Java项目中使用它吗? 框架:https://github.com/mpetlyuk/initial_tips Kotlin上的用法:

  • 我目前正在开发一个SpringBootJAR库,用于可重用的组件,比如 ldap 电子邮件 与apache kafka消息 其余api用法 我们公司的每个Java用户/程序员都应该能够把这个罐子放在一个项目中(通过maven或其他方式),并使用可重用的组件,而不是一遍又一遍地编码所有的东西。 在REST之上为该问题构建微服务不是我们的选择。 我的问题是: 我可以在任何普通Java项目中重用这个Sp

  • 我对分级建造系统和智能是新的。 那么我如何创建一个Android库项目(例如com.myapp.lib1)和应用程序项目(例如com.myapp.app),并使构建系统在应用程序项目上包含com.myapp.lib1呢? 我转到Project Structure->Modules->我的App项目,并向lib项目添加了一个依赖项。IntelliJ现在在应用程序项目中使用时可以从lib项目中识别类,

  • 虽然我在构建中集成了库。但当我在设备上运行它时,会发生以下错误。 我的代码是这样的,buidl。格拉德尔 我正在使用Lucence的类 模范班 这一切从哪里开始 }

  • 我已经建立了一个小Java项目使用一些参考库(Lucene jar文件,位于我的PC上的某个地方)。 我正在尝试使用Saro与一位朋友分享这些项目,以便我们可以同时进行工作。 除了他看不到被引用的库和应用程序不能在他的计算机上运行之外,一切都很好。 有什么建议吗?