java.util.logging.Logger和log4j

我正在尝试从这里编译代码: http : //www.brackeen.com/javagamebook/#download (第6章),我遇到了麻烦。 我不明白java.util.logging.Logger和log4j如何协同工作,但这似乎是个问题。 我得到的错误都在log.error()log.warn()方法调用上。

以下是NetBeans的输出:

在里面:
 DEPS清洁:
删除目录C:\ JB \ NetBeansProjects \ WRServer \ build
删除目录C:\ JB \ NetBeansProjects \ WRServer \ dist
清洁:
在里面:
 DEPS-JAR:
创建目录:C:\ JB \ NetBeansProjects \ WRServer \ build \ classes
将23个源文件编译为C:\ JB \ NetBeansProjects \ WRServer \ build \ classes
 C:\ JB \ NetBeansProjects \ WRServer \ src \ com \ hypefiend \ javagamebook \ server \ GameServer.java:110:找不到符号
 symbol:方法错误(java.lang.String,java.lang.Exception)
 location:类java.util.logging.Logger
             log.error(“初始化ServerSocket的错误”,e);
                ^
 C:\ JB \ NetBeansProjects \ WRServer \ src \ com \ hypefiend \ javagamebook \ server \ GameServer.java:152:找不到符号
 symbol:method warn(java.lang.String)
 location:类java.util.logging.Logger
                 log.warn(“serverSocket select()中的错误:”+ ioe.getMessage());
                    ^
 C:\ JB \ NetBeansProjects \ WRServer \ src \ com \ hypefiend \ javagamebook \ server \ GameServer.java:155:找不到符号
 symbol:方法错误(java.lang.String,java.lang.Exception)
 location:类java.util.logging.Logger
                 log.error(“run()中的exception”,e);
                    ^
 C:\ JB \ NetBeansProjects \ WRServer \ src \ com \ hypefiend \ javagamebook \ server \ GameServer.java:187:找不到符号
 symbol:方法错误(java.lang.String)
 location:类java.util.logging.Logger
             log.error(“没有gameNameHash的gamecontroller:”+ gameNameHash);
                ^
 C:\ JB \ NetBeansProjects \ WRServer \ src \ com \ hypefiend \ javagamebook \ server \ GameServer.java:203:找不到符号
 symbol:方法错误(java.lang.String)
 location:类java.util.logging.Logger
             log.error(“获取GameController目录时出错”);
                ^
 C:\ JB \ NetBeansProjects \ WRServer \ src \ com \ hypefiend \ javagamebook \ server \ GameServer.java:223:找不到符号
 symbol:method warn(java.lang.String)
 location:类java.util.logging.Logger
                     log.warn(“类文件不扩展GameController:”+文件);
                        ^
 C:\ JB \ NetBeansProjects \ WRServer \ src \ com \ hypefiend \ javagamebook \ server \ GameServer.java:238:找不到符号
 symbol:方法错误(java.lang.String,java.lang.Exception)
 location:类java.util.logging.Logger
                 log.error(“从文件中实例化GameController的错误:”+ file,e);
                    ^
注意:某些输入文件使用未经检查或不安全的操作。
注意:使用-Xlint重新编译:取消选中以获取详细信息。
 7个错误
 BUILD FAILED(总时间:0秒)

这是本书的代码。 我还没有尝试编辑它。

 package com.hypefiend.javagamebook.server; import com.hypefiend.javagamebook.common.*; import com.hypefiend.javagamebook.server.controller.*; import java.nio.channels.*; import java.util.*; import java.net.*; import java.io.*; import java.util.logging.Logger; import org.apache.log4j.*; /** * GameServer.java * * The heart of the framework, GameServer accepts * incoming client connections and hands them off to * the SelectAndRead class. * GameServer also keeps track of the connected players * and the GameControllers. * * @author bret barker * @version 1.0 */ public class GameServer extends Thread { /** log4j Logger */ private Logger log = Logger.getLogger("GameServer"); /** ServerSocketChannel for accepting client connections */ private ServerSocketChannel sSockChan; /** selector for multiplexing ServerSocketChannels */ private Selector selector; /** GameControllers keyed by GameName */ private Hashtable gameControllers; /** classname prefix used for dynamically loading GameControllers */ private static final String CONTROLLER_CLASS_PREFIX = "com.hypefiend.javagamebook.server.controller."; /** players keyed by playerId */ private static Hashtable playersByPlayerId; /** players keyed by sessionId */ private static Hashtable playersBySessionId; private boolean running; private SelectAndRead selectAndRead; private EventWriter eventWriter; private static long nextSessionId = 0; /** * main. * setup log4j and fireup the GameServer */ public static void main(String args[]) { BasicConfigurator.configure(); GameServer gs = new GameServer(); gs.start(); } /** * constructor, just initialize our hashtables */ public GameServer() { gameControllers = new Hashtable(); playersByPlayerId = new Hashtable(); playersBySessionId = new Hashtable(); } /** * init the GameServer, startup our workers, etc. */ public void init() { log.info("GameServer initializing"); loadGameControllers(); initServerSocket(); selectAndRead = new SelectAndRead(this); selectAndRead.start(); eventWriter = new EventWriter(this, Globals.EVENT_WRITER_WORKERS); } /** * GameServer specific initialization, bind to the server port, * setup the Selector, etc. */ private void initServerSocket() { try { // open a non-blocking server socket channel sSockChan = ServerSocketChannel.open(); sSockChan.configureBlocking(false); // bind to localhost on designated port InetAddress addr = InetAddress.getLocalHost(); log.info("binding to address: " + addr.getHostAddress()); sSockChan.socket().bind(new InetSocketAddress(addr, Globals.PORT)); // get a selector selector = Selector.open(); // register the channel with the selector to handle accepts SelectionKey acceptKey = sSockChan.register(selector, SelectionKey.OP_ACCEPT); } catch (Exception e) { log.error("error initializing ServerSocket", e); System.exit(1); } } /** * Here's the meat, loop over the select() call to * accept socket connections and hand them off to SelectAndRead */ public void run() { init(); log.info("******** GameServer running ********"); running = true; int numReady = 0; while (running) { // note, since we only have one ServerSocket to listen to, // we don't need a Selector here, but we set it up for // later additions such as listening on another port // for administrative uses. try { // blocking select, will return when we get a new connection selector.select(); // fetch the keys Set readyKeys = selector.selectedKeys(); // run through the keys and process Iterator i = readyKeys.iterator(); while (i.hasNext()) { SelectionKey key = (SelectionKey) i.next(); i.remove(); ServerSocketChannel ssChannel = (ServerSocketChannel) key.channel(); SocketChannel clientChannel = ssChannel.accept(); // add to the list in SelectAndRead for processing selectAndRead.addNewClient(clientChannel); log.info("got connection from: " + clientChannel.socket().getInetAddress()); } } catch (IOException ioe) { log.warn("error during serverSocket select(): " + ioe.getMessage()); } catch (Exception e) { log.error("exception in run()", e); } } } /** * shutdown the GameServer */ public void shutdown() { selector.wakeup(); } /** * Return the next available sessionId */ public synchronized String nextSessionId() { return "" + nextSessionId++; } /** * finds the GameController for a given GameName */ public GameController getGameController(String gameName) { return getGameControllerByHash(gameName.hashCode()); } /** * finds the GameController for a given GameName hash code */ public GameController getGameControllerByHash(int gameNameHash) { GameController gc = (GameController) gameControllers.get("" + gameNameHash); if (gc == null) log.error("no gamecontroller for gameNameHash: " + gameNameHash); return gc; } /** * Dynamically loads GameControllers */ private void loadGameControllers() { log.info("loading GameControllers"); // grab all class files in the same directory as GameController String baseClass = "com/hypefiend/javagamebook/server/controller/GameController.class"; File f = new File( this.getClass( ).getClassLoader().getResource(baseClass).getPath()); File[] files = f.getParentFile().listFiles( ); if (files == null) { log.error("error getting GameController directory"); return; } for( int i = 0; ( i < files.length); i++) { String file = files[i].getName( ); if (file.indexOf( ".class") == -1) continue; if (file.equals("GameController.class")) continue; try { // grab the class String controllerClassName = CONTROLLER_CLASS_PREFIX + file.substring(0, file.indexOf(".class")); log.info("loading class: " + controllerClassName); Class cl = Class.forName(controllerClassName); // make sure it extends GameController if (!GameController.class.isAssignableFrom(cl)) { log.warn("class file does not extend GameController: " + file); continue; } // get an instance and initialize GameController gc = (GameController) cl.newInstance(); String gameName = gc.getGameName(); gc.init(this, getGameConfig(gameName)); // add to our controllers hash gameControllers.put("" + gameName.hashCode(), gc); log.info("loaded controller for gameName: " + gameName + ", hash: " + gameName.hashCode()); } catch (Exception e) { log.error("Error instantiating GameController from file: " + file, e); } } } /** * pass the event on to the EventWriter */ public void writeEvent(GameEvent e) { eventWriter.handleEvent(e); } /** * returns the GameConfig object for the given gameName */ public GameConfig getGameConfig(String gameName) { // todo: implement getGameConfig() return null; } /** * fetches the Player for a given playerId */ public static Player getPlayerById( String id) { return (Player) playersByPlayerId.get(id); } /** * fetches the Player for a given sessionId */ public static Player getPlayerBySessionId(String id) { return (Player) playersBySessionId.get(id); } /** * add a player to our lists */ public static void addPlayer(Player p) { playersByPlayerId.put(p.getPlayerId(), p); playersBySessionId.put(p.getSessionId(), p); } /** * remove a player from our lists */ public static void removePlayer(Player p) { playersByPlayerId.remove(p.getPlayerId()); playersBySessionId.remove(p.getPlayerId()); } }// GameServer 

在您的类中导入java.util.logging.Logger似乎导致了问题(编译器尝试针对该问题进行编译,尽管似乎意图使用log4j Logger类)。

尝试从导入和重新编译中删除java.util.logging.Logger。

编辑:好吧,我刚刚从问题中链接的页面中链接的ZIP文件中检查了原始的GameServer.java。 它不包含任何java.util.logging.Logger的导入。 我猜是这样的:

  • 您没有在项目的类路径上使用log4j
  • 您或您的IDE尝试以某种方式自动组织导入。 这最终将java.util.logging.Logger添加到导入,因为在项目的类路径中找不到该名称的其他类。

因此,首先将log4j添加到类路径中,然后从导入中删除java.util.logging.Logger。

java.util.logging.Logger没有warn()方法(尽管它有一个warning()方法)。

但是, org.apache.log4j.Logger确实有一个名为warn()的方法。

您确定要导入正确的课程吗?

你可以格式化你的代码吗? Ti会更具可读性……

您正在尝试在java.util.logger.Logger的实例上调用错误(String,String)方法。 没有这样的方法。 您应该使用Logger.log(Level.SEVERE,“mesage”),或使用log4J Logger的实例。 检查源文件的导入部分……