1

我有个问题。我想在我的应用程序中添加秒表显示。我用这个页面作为参考。我下载并添加了必要的 commons-scxml-0.9.jar 库(带有源代码)。Eclipse 中没有错误,但是当我调试它时,在这个的超类(AbstractStateMachine)的构造函数中使用以下命令调用:

super(StopWatch.class.getClassLoader().getResource("org/apache/commons/scxml/env/stopwatch.xml"));

但是超类构造函数没有任何属性。它需要最终 URL scxmlDocument,但只出现null

我知道 stopwatch.xml 的外观,但我应该把它放在哪里,以及如何从中创建最终 URL scxmlDocument

我尝试了一切,但没有任何效果。

谢谢你们 !!

这是 stopwatch.xml,如果我添加它,eclipse 会因为id属性而报告错误:

`<?xml version="1.0" ?> 

            <transition event="watch.start" target="running" /> 
    </state>
    <state id="running">
            <transition event="watch.split" target="paused" /> 
            <transition event="watch.stop" target="stopped" />
    </state>
    <state id="paused">
            <transition event="watch.unsplit" target="running" /> 
            <transition event="watch.stop" target="stopped" /> 
    </state>
    <state id="stopped">
            <transition event="watch.reset" target="reset" /> 
    </state>

`

4

1 回答 1

0

你的代码看起来不错。如果您在运行时遇到异常,则应该将其包含在您的问题中。XML 看起来也很好,除了您排除了前几行和最后一行(这是故意的还是您的 XML 真的缺少这些行?)。这是我的 XML:

<?xml version="1.0"?>
<!--
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
-->
<scxml xmlns="http://www.w3.org/2005/07/scxml"
       version="1.0"
       initial="reset">

    <state id="reset">
        <transition event="watch.start"   target="running"/>
    </state>

    <state id="running">
        <transition event="watch.split"   target="paused"/>
        <transition event="watch.stop"    target="stopped"/>
    </state>

    <state id="paused">
        <transition event="watch.unsplit" target="running"/>
        <transition event="watch.stop"    target="stopped"/>
    </state>

    <state id="stopped">
        <transition event="watch.reset"   target="reset"/>
    </state>

</scxml>

至于将 XML 文件放在哪里,通常您会将其放在 SRC 目录中。当 Eclipse 进行构建时,它不知道如何处理 XML 文件,因此它的默认行为是将其复制到编译代码所在的 BIN 目录。你可能需要做一个Project > Clean...来实现这一点。这是运行时环境通常期望找到这样的资源的地方。

这里有一个非常好的技巧:如果您在任何版本的 Windows 上进行开发,您可以访问 Microsoft 非常棒的 Sysinternals 站点 ( http://technet.microsoft.com/en-US/sysinternals )。在这里您可以找到出色的 Process Monitor 实用程序。下载、安装和运行这个免费的实用程序。在实用程序中,创建一个进程监视器过滤器:Path | contains | stopwatch.xml 确保启用此过滤器并禁用所有其他(预定义)过滤器。

然后运行你编译的秒表程序。该实用程序将显示应用程序(以及其中包含的所有类加载器)查找的每个位置stopwatch.xml

然后,您可以移动/复制/任何文件,以确保它位于应用程序查找文件的位置。此实用程序对于编写 J2EE 应用程序(例如 Tomcat、Websphere 等)时出现的类似“我找不到资源”问题特别方便。

最后,虽然您没有提及任何有关依赖 jar 文件的内容,但请确保它们位于类路径中:

commons-beanutils-1.9.2.jar
commons-digester-2.1.jar
commons-jexl-1.1.jar
commons-logging-1.2.jar
commons-scxml-0.9.jar
log4j-1.2.17.jar
xalan.jar
于 2015-01-14T19:57:37.993 回答