我正在尝试从这里编译代码:http://www.brackeen.com/javagamebook/#download(第6章),我遇到了麻烦.我不明白java.util.logging.Logger
和log4j 如何协同工作,但这似乎是个问题.我得到的错误都在log.error()
或log.warn()
方法调用.
以下是NetBeans的输出:
init: deps-clean: Deleting directory C:\JB\NetBeansProjects\WRServer\build Deleting directory C:\JB\NetBeansProjects\WRServer\dist clean: init: deps-jar: Created dir: C:\JB\NetBeansProjects\WRServer\build\classes Compiling 23 source files to C:\JB\NetBeansProjects\WRServer\build\classes C:\JB\NetBeansProjects\WRServer\src\com\hypefiend\javagamebook\server\GameServer.java:110: cannot find symbol symbol : method error(java.lang.String,java.lang.Exception) location: class java.util.logging.Logger log.error("error initializing ServerSocket", e); ^ C:\JB\NetBeansProjects\WRServer\src\com\hypefiend\javagamebook\server\GameServer.java:152: cannot find symbol symbol : method warn(java.lang.String) location: class java.util.logging.Logger log.warn("error during serverSocket select(): " + ioe.getMessage()); ^ C:\JB\NetBeansProjects\WRServer\src\com\hypefiend\javagamebook\server\GameServer.java:155: cannot find symbol symbol : method error(java.lang.String,java.lang.Exception) location: class java.util.logging.Logger log.error("exception in run()", e); ^ C:\JB\NetBeansProjects\WRServer\src\com\hypefiend\javagamebook\server\GameServer.java:187: cannot find symbol symbol : method error(java.lang.String) location: class java.util.logging.Logger log.error("no gamecontroller for gameNameHash: " + gameNameHash); ^ C:\JB\NetBeansProjects\WRServer\src\com\hypefiend\javagamebook\server\GameServer.java:203: cannot find symbol symbol : method error(java.lang.String) location: class java.util.logging.Logger log.error("error getting GameController directory"); ^ C:\JB\NetBeansProjects\WRServer\src\com\hypefiend\javagamebook\server\GameServer.java:223: cannot find symbol symbol : method warn(java.lang.String) location: class java.util.logging.Logger log.warn("class file does not extend GameController: " + file); ^ C:\JB\NetBeansProjects\WRServer\src\com\hypefiend\javagamebook\server\GameServer.java:238: cannot find symbol symbol : method error(java.lang.String,java.lang.Exception) location: class java.util.logging.Logger log.error("Error instantiating GameController from file: " + file, e); ^ Note: Some input files use unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. 7 errors BUILD FAILED (total time: 0 seconds)
以下是本书的代码.我还没有尝试编辑它.
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
matt b.. 5
java.util.logging.Logger
没有warn()
方法(虽然它有一个warning()
方法).
但是,org.apache.log4j.Logger
确实有一个名为的方法warn()
.
您确定要导入正确的课程吗?
java.util.logging.Logger
没有warn()
方法(虽然它有一个warning()
方法).
但是,org.apache.log4j.Logger
确实有一个名为的方法warn()
.
您确定要导入正确的课程吗?
在您的类中导入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.