我在运行Java项目时遇到问题。
E:\Workspace\compiled>java -classpath server\libraries\log4j-1.2.16.jar;E:\Workspace\compiled\server\service-1.0-SNAPSHOT.jar;E:\Workspace\compiled\server\libraries\log4j-1.2.16.jar -Djava.security.policy=E:\Workspace\compiled\socket.policy -Djava.rmi.server.codebase=file:///E:\Workspace\compiled\server\service-1.0-SNAPSHOT.jar -jar E:\Workspace\compiled\server\service-1.0-SNAPSHOT.jar E:\Workspace\compiled\log4j.properties Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/PropertyConfigurator at pwr.mgr.server.service.Launcher.main(Launcher.java:18) Caused by: java.lang.ClassNotFoundException: org.apache.log4j.PropertyConfigurator at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 1 more
它使用maven编译,最终得到.jar文件。我今天决定,我将使用log4j代替wimple System.out进行日志记录…在此更改之前,它工作正常
这是我的运行方式
java -cp .;%SRV_ADDR%;%SRV_LIBS% -Djava.security.policy=%POLICY_FILE% -Djava.rmi.server.codebase=file:///%SRV_ADDR% pwr.mgr.server.service.Launcher %CD%\log4j.properties
SRV_ADDR指向我的service.jar(带有Launcher类)
SRV_LIBS指向log4j-1.2.16.jar
我加了“。;” 一开始希望它会有所帮助,因为提到的文件在我尝试启动的子目录中。
我还应该提到我需要在这里某个地方保存log4j库,因为我将把我的应用程序移动到另一台机器上,而且我不知道在那里需要什么库,也许只是纯Java,所以我需要将所有内容都打包到一个包中。
如果有人对Launcher类感兴趣,这很简单:
public class Launcher { public static void main(String args[]) { PropertyConfigurator.configure(args[0]); if (System.getSecurityManager() == null) { System.setSecurityManager(new SecurityManager()); } try { Runtime.getRuntime().exec("rmiregistry"); ServerIntf obj = new Server(); Registry registry = LocateRegistry.getRegistry(); registry.rebind("Server", obj); System.out.println("Server bound in registry"); } catch (Exception e) { System.out.println("Server err: " + e.getMessage()); e.printStackTrace(); } } }
有人知道我在做什么错吗?也许仅添加一个log4j jar文件是不够的?我从maven存储库复制了它。
EDIT1 已经将我指向的jar从log4j-1.2.16-javadoc.jar更改为log4j-1.2.16.jar,但没有帮助
使用时java -jar ...,将-classpath忽略该参数。在主jar的清单中指定所有必需的jar(但您只能在其中使用相对路径),或者将主jar添加到-classpath并在命令行上提及主类。
java -jar ...
-classpath
是的,我也不喜欢这样。