如何解决VS Code中运行JADE平台Java代码时的编译错误
解决VS Code中JADE平台Java代码的编译错误
问题代码
import jade.core.Agent; import jade.core.Runtime; import jade.core.Profile; import jade.core.ProfileImpl; import jade.core.behaviours.*; import jade.lang.acl.ACLMessage; import jade.lang.acl.MessageTemplate; public class Main { public static void main(String[] args) { Runtime rt = Runtime.instance(); Profile p = new ProfileImpl(); AgentContainer container = rt.createMainContainer(p); try { AgentController seller = jade.core.container.createNewAgent("Seller", SellerAgent.class, null); seller.start(); String[] buyerArgs = new String[]{"A"}; AgentController buyer1 = container.createNewAgent("B1", BuyerAgent.class, buyerArgs); buyer1.start(); buyerArgs[0] = "B"; AgentController buyer2 = container.createNewAgent("B2", BuyerAgent.class, buyerArgs); buyer2.start(); buyerArgs[0] = "A"; AgentController buyer3 = container.createNewAgent("B3", BuyerAgent.class, buyerArgs); buyer3.start(); buyerArgs[0] = "B"; AgentController buyer4 = container.createNewAgent("B4", BuyerAgent.class, buyerArgs); buyer4.start(); } catch (Exception e) { e.printStackTrace(); } } } public class BuyerAgent extends Agent { private String requestedProduct; private String sellerName; private List<String> purchasedProducts = new ArrayList<>(); protected void setup() { // Get the requested product name as an argument Object[] args = getArguments(); if (args != null && args.length > 0) { requestedProduct = (String) args[0]; } // Add the behavior to request the product from the seller addBehaviour(new RequestProductBehaviour()); } private class RequestProductBehaviour extends OneShotBehaviour { public void action() { ACLMessage message = new ACLMessage(ACLMessage.REQUEST); message.setContent(requestedProduct); message.addReceiver(sellerName); myAgent.send(message); // Wait for the seller's response addBehaviour(new PurchaseResponseBehaviour()); } } private class PurchaseResponseBehaviour extends SimpleBehaviour { private boolean receivedResponse = false; public void action() { MessageTemplate mt = MessageTemplate.MatchPerformative(ACLMessage.INFORM); ACLMessage message = myAgent.receive(mt); if (message != null) { // Product was available and was sold to this buyer purchasedProducts.add(requestedProduct); receivedResponse = true; } else { block(); } } public boolean done() { if (receivedResponse) { System.out.println(getLocalName() + " purchased: " + purchasedProducts); } return receivedResponse; } } } public class SellerAgent extends Agent { private int itemsA = 2; private int itemsB = 2; private List<String> buyers = new ArrayList<>(); protected void setup() { // Add the behavior to handle product request messages addBehaviour(new HandleRequestBehaviour()); } private class HandleRequestBehaviour extends CyclicBehaviour { public void action() { MessageTemplate mt = MessageTemplate.MatchPerformative(ACLMessage.REQUEST); ACLMessage message = myAgent.receive(mt); if (message != null) { String product = message.getContent(); String buyerName = message.getSender().getLocalName(); ACLMessage reply = message.createReply(); if (buyerName.equals("B3") && product.equals("B")) { // Seller cannot sell product B to buyer B3 reply.setPerformative(ACLMessage.FAILURE); reply.setContent("Not allowed"); } else if (product.equals("A") && itemsA > 0) { itemsA--; reply.setPerformative(ACLMessage.INFORM); buyers.add(buyerName); } else if (product.equals("B") && itemsB > 0) { itemsB--; reply.setPerformative(ACLMessage.INFORM); buyers.add(buyerName); } else { reply.setPerformative(ACLMessage.FAILURE); reply.setContent("Not available"); } myAgent.send(reply); } else { block(); } } } protected void takeDown() { System.out.println("Seller " + getLocalName() + " sold to: " + buyers); } }
错误信息
Exception in thread "main" java.lang.Error: 未解决的编译问题: 类型Runtime中未定义方法instance() Profile无法解析为类型 ProfileImpl无法解析为类型 AgentContainer无法解析为类型 AgentController无法解析为类型 jade无法解析 AgentController无法解析为类型 AgentController无法解析为类型 AgentController无法解析为类型 AgentController无法解析为类型 at Main.main(main.java:10)
解决方案
核心原因
所有编译错误的根源是JADE核心库未被正确添加到项目的编译路径中,导致Java编译器无法识别JADE提供的Runtime、Profile、AgentContainer等类和方法。
具体解决步骤
引入JADE库
- 下载对应版本的JADE包,提取其中的
jade.jar文件 - 在VS Code项目中创建
lib目录,将jade.jar放入该目录 - 右键点击
jade.jar,选择Add to Build Path,让编译器识别该依赖
- 下载对应版本的JADE包,提取其中的
修正代码中的语法与逻辑问题
- 错误1:创建Seller Agent的方法调用错误
将jade.core.container.createNewAgent("Seller", SellerAgent.class, null)改为container.createNewAgent("Seller", SellerAgent.class, null),createNewAgent是AgentContainer实例的方法,而非静态方法 - 错误2:缺少集合类导入
在BuyerAgent和SellerAgent的顶部添加导入语句:import java.util.List; import java.util.ArrayList; - 错误3:BuyerAgent中sellerName未初始化且消息接收方格式错误
在BuyerAgent的setup方法中添加sellerName = "Seller";,同时将message.addReceiver(sellerName)改为message.addReceiver(new jade.core.AID(sellerName, jade.core.AID.ISLOCALNAME)),因为JADE消息接收方需要传入AID对象而非字符串名称
- 错误1:创建Seller Agent的方法调用错误
修正后的完整代码
import jade.core.Agent; import jade.core.Runtime; import jade.core.Profile; import jade.core.ProfileImpl; import jade.core.AgentContainer; import jade.core.AgentController; import jade.core.behaviours.*; import jade.lang.acl.ACLMessage; import jade.lang.acl.MessageTemplate; import java.util.List; import java.util.ArrayList; public class Main { public static void main(String[] args) { Runtime rt = Runtime.instance(); Profile p = new ProfileImpl(); AgentContainer container = rt.createMainContainer(p); try { AgentController seller = container.createNewAgent("Seller", SellerAgent.class, null); seller.start(); String[] buyerArgs = new String[]{"A"}; AgentController buyer1 = container.createNewAgent("B1", BuyerAgent.class, buyerArgs); buyer1.start(); buyerArgs[0] = "B"; AgentController buyer2 = container.createNewAgent("B2", BuyerAgent.class, buyerArgs); buyer2.start(); buyerArgs[0] = "A"; AgentController buyer3 = container.createNewAgent("B3", BuyerAgent.class, buyerArgs); buyer3.start(); buyerArgs[0] = "B"; AgentController buyer4 = container.createNewAgent("B4", BuyerAgent.class, buyerArgs); buyer4.start(); } catch (Exception e) { e.printStackTrace(); } } } public class BuyerAgent extends Agent { private String requestedProduct; private String sellerName; private List<String> purchasedProducts = new ArrayList<>(); protected void setup() { // 初始化卖家名称 sellerName = "Seller"; // 获取请求的产品参数 Object[] args = getArguments(); if (args != null && args.length > 0) { requestedProduct = (String) args[0]; } // 添加请求产品的行为 addBehaviour(new RequestProductBehaviour()); } private class RequestProductBehaviour extends OneShotBehaviour { public void action() { ACLMessage message = new ACLMessage(ACLMessage.REQUEST); message.setContent(requestedProduct); // 通过本地名称获取卖家的AID message.addReceiver(new jade.core.AID(sellerName, jade.core.AID.ISLOCALNAME)); myAgent.send(message); // 添加等待响应的行为 addBehaviour(new PurchaseResponseBehaviour()); } } private class PurchaseResponseBehaviour extends SimpleBehaviour { private boolean receivedResponse = false; public void action() { MessageTemplate mt = MessageTemplate.MatchPerformative(ACLMessage.INFORM); ACLMessage message = myAgent.receive(mt); if (message != null) { // 成功购买产品 purchasedProducts.add(requestedProduct); receivedResponse = true; } else { block(); } } public boolean done() { if (receivedResponse) { System.out.println(getLocalName() + " purchased: " + purchasedProducts); } return receivedResponse; } } } public class SellerAgent extends Agent { private int itemsA = 2; private int itemsB = 2; private List<String> buyers = new ArrayList<>(); protected void setup() { // 添加处理请求的行为 addBehaviour(new HandleRequestBehaviour()); } private class HandleRequestBehaviour extends CyclicBehaviour { public void action() { MessageTemplate mt = MessageTemplate.MatchPerformative(ACLMessage.REQUEST); ACLMessage message = myAgent.receive(mt); if (message != null) { String product = message.getContent(); String buyerName = message.getSender().getLocalName(); ACLMessage reply = message.createReply(); if (buyerName.equals("B3") && product.equals("B")) { // 禁止卖给B3产品B reply.setPerformative(ACLMessage.FAILURE); reply.setContent("Not allowed"); } else if (product.equals("A") && itemsA > 0) { itemsA--; reply.setPerformative(ACLMessage.INFORM); buyers.add(buyerName); } else if (product.equals("B") && itemsB > 0) { itemsB--; reply.setPerformative(ACLMessage.INFORM); buyers.add(buyerName); } else { reply.setPerformative(ACLMessage.FAILURE); reply.setContent("Not available"); } myAgent.send(reply); } else { block(); } } } protected void takeDown() { System.out.println("Seller " + getLocalName() + " sold to: " + buyers); } }
内容的提问来源于stack exchange,提问作者xfull xfullian
相关产品推荐
相关产品推荐

