Apache Commons SCXML - 找不到 JexlContext
我是 SCXML 新手,甚至无法启动最简单的应用程序。当我尝试启动它时,出现以下异常。但我在类路径上有该类的库 commons-scxml-0.9.jar
。有什么想法吗?
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/jexl/JexlContext
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at org.apache.commons.scxml.env.AbstractStateMachine.<init>(AbstractStateMachine.java:103)
at main.StateMachineImpl.<init>(StateMachineImpl.java:8)
at main.Main.main(Main.java:6)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.jexl.JexlContext
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 15 more
这是代码:
Main class
public class Main {
public static void main(String[] args) {
StateMachineImpl stateMachineImpl = new StateMachineImpl();
stateMachineImpl.fireEvent(Event.START.getEvent());
stateMachineImpl.fireEvent(Event.STOP.getEvent());
}
}
Event
public enum Event {
START("event.start"), STOP("event.stop");
private String event;
private Event(String event) {
this.event = event;
}
public String getEvent() {
return event;
}
public void setEvent(String event) {
this.event = event;
}
}
StateMachineImpl
public class StateMachineImpl extends AbstractStateMachine {
public StateMachineImpl() {
super(StateMachineImpl.class.getClassLoader().getResource("state-machine-cfg.xml"));
}
public void off() {
System.out.println("StateMachine is OFF");
}
public void running() {
System.out.println("StateMachine is RUNNING");
}
}
state-machine-cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0"
initialstate="off">
<state id="off">
<transition event="event.start" target="running" />
</state>
<state id="running">
<transition event="event.stop" target="off" />
</state>
</scxml>
编辑 - 解决方案: 我必须添加额外的依赖项(我认为它们会由 Maven 自动加载)。
pom.xml 依赖项
<dependency>
<groupId>commons-scxml</groupId>
<artifactId>commons-scxml</artifactId>
<version>0.9</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>commons-jexl</groupId>
<artifactId>commons-jexl</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>xalan</groupId>
<artifactId>xalan</artifactId>
<version>2.7.1</version>
</dependency>
I'm new to SCXML and I cannot start even the simplest application. When I try to start it I get the following exception. But I have the library commons-scxml-0.9.jar
with that class on classpath. Any ideas?
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/jexl/JexlContext
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at org.apache.commons.scxml.env.AbstractStateMachine.<init>(AbstractStateMachine.java:103)
at main.StateMachineImpl.<init>(StateMachineImpl.java:8)
at main.Main.main(Main.java:6)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.jexl.JexlContext
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 15 more
Here is the code:
Main class
public class Main {
public static void main(String[] args) {
StateMachineImpl stateMachineImpl = new StateMachineImpl();
stateMachineImpl.fireEvent(Event.START.getEvent());
stateMachineImpl.fireEvent(Event.STOP.getEvent());
}
}
Event
public enum Event {
START("event.start"), STOP("event.stop");
private String event;
private Event(String event) {
this.event = event;
}
public String getEvent() {
return event;
}
public void setEvent(String event) {
this.event = event;
}
}
StateMachineImpl
public class StateMachineImpl extends AbstractStateMachine {
public StateMachineImpl() {
super(StateMachineImpl.class.getClassLoader().getResource("state-machine-cfg.xml"));
}
public void off() {
System.out.println("StateMachine is OFF");
}
public void running() {
System.out.println("StateMachine is RUNNING");
}
}
state-machine-cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0"
initialstate="off">
<state id="off">
<transition event="event.start" target="running" />
</state>
<state id="running">
<transition event="event.stop" target="off" />
</state>
</scxml>
EDIT - solution:
I have to add additional dependencies (I thought they would be loaded by Maven automatically).
pom.xml dependencies
<dependency>
<groupId>commons-scxml</groupId>
<artifactId>commons-scxml</artifactId>
<version>0.9</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>commons-jexl</groupId>
<artifactId>commons-jexl</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>xalan</groupId>
<artifactId>xalan</artifactId>
<version>2.7.1</version>
</dependency>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
添加
commons-jexl.jar
也到 CLASSPATH 中。根据项目pom. xml
在 0.9 版本中,您还需要(不包括传递依赖项):commons-logging
commons-digester
commons-beanutils
commons-el
Add
commons-jexl.jar
to the CLASSPATH as well. According to the projectpom.xml
in version 0.9 you will also need (excluding transitive depndencies):commons-logging
commons-digester
commons-beanutils
commons-el
所有 SCXML 依赖项 jar 都可以在这里找到:
http://commons.apache.org/scxml/dependency。 html
All SCXML dependency jars can be found here:
http://commons.apache.org/scxml/dependencies.html
在问题提出近 12 年后我又遇到了同样的问题。答案不适用于当前版本的 common-scxml2。我找到了添加当前需要的 jexl3 版本的灵魂。
I got the same problem almost 12 years after the question. The answser are not working for the current version of common-scxml2. I found a soultion with adding the currently needed version of jexl3.