高级自由格式项目配置

对于使用 Ant 脚本生成和运行应用程序的 Java 开发者,IDE 中的自由格式项目为提供了一个非常强大的工具。

如果你熟悉使用 Ant,就可以编辑 Ant 脚本和 IDE 项目配置文件,使得 NetBeans IDE 和你的生成过程之间更紧密地集成。

本文假设你已经使用“新建项目”向导建立了一个自由格式项目。

本文覆盖了下列信息:

你还可以下载示例 Ant 目标

在自由格式项目中映射类路径

在自由格式项目中,所有源文件夹的类路径都是由 Ant 脚本处理的。要让项目源代码可用于 Ant,就需要为项目源代码指定类路径。如果有任何定制任务,还需要将它们添加到 Ant 的类路径。

为项目源代码指定类路径

在自由格式项目中,你告诉 IDE 哪些类需要进行代码完成和重构,并为这些项目源指定类路径。在“项目属性”对话框的“Java 源类路径”设置中指定类路径。这样做是因为缺省情况下,不管何时运行 Ant,IDE 都将忽略环境中的 CLASSPATH 变量。

在“项目属性”对话框中设置的类路径变量不会影响 Ant 脚本中指定的项目实际类路径。在“项目属性”对话框中声明类路径不会改变源文件夹的实际编译或运行时类路径。然而,项目类路径变量必须匹配 Ant 脚本所用的类路径,以便为代码编译、错误突出显示和重构命令提供正确信息。你必须在生成脚本中设置显式类路径,因为不管何时运行 Ant,IDE 都将忽略环境中的 CLASSPATH 变量。如果你更改其中一个类路径,就必须更改另一个类路径。

为定制任务指定类路径

在自由格式项目中,可以在生成脚本中调用并运行定制 Ant 任务。为使生成脚本能够使用定制任务,必须将这些任务添加到 IDE 中的 Ant 类路径中。例如,你可能要将一项任务添加到生成脚本以便用 Jalopy 格式化你的代码。然而,为此你必须将 Jalopy JAR 文件添加到 Ant 的类路径。

按下列方法之一,将定制任务添加到 IDE 内的 Ant 类路径:

  • 在生成脚本中提供到任务的显式类路径。这是推荐的方法,因为它指定了包含 Ant 脚本要使用的定制任务的 JAR 文件的位置,从而确保了生成脚本是完全可移植的。你可以在生成文件中编写自己的任务以及添加指令,以进行编译和产生 JAR 文件。在使用这些任务时,需要加入一个长 taskdef 标记,并在其中包含类路径。这是此类任务的一个简单示例:
<project name="test" default="all" basedir=".">
    <target name="init">
        <javac srcdir="tasksource" destdir="build/taskclasses"/>
        <jar jarfile="mytasks.jar">
            <fileset dir="build/taskclasses"/>
        </jar>
        <taskdef name="customtask" classname="com.mycom.MyCustomTask">
            <classpath>
                 <pathelement location="mytasks.jar"/>
            </classpath>
        </taskdef>
    </target>
</project>
            

这种方法的优点在于不需要特殊准备即可开始使用脚本。该脚本完全是自包含并可移植的。此方法还使你在 IDE 中开发任务变得更容易,因为脚本会自动为您编译这些任务。

要使您的生成脚本更加稳定,请使用属性来代替固定编码位置,用以指定任务的类路径。你可以将该属性保存在生成脚本或单独的 ant.properties 文件中。然后,只更改指定属性的值就可以使整个脚本的类路径设置得到更改。

  • 配置“选项”窗口中的“Ant 类路径”属性。如果无法在生成脚本中声明类路径,或使用无法更改的第三方生成脚本,则可以在“选项”窗口中,将任务添加到 IDE 中的 Ant 类路径。

注意:如果在“选项”窗口中修改了 Ant 类路径,则当在 IDE 中运行 Ant 时,对于所有的项目,任务都在 Ant 的类路径上。

将 IDE 命令映射到 Ant 目标

有三种当时来将 IDE 命令映射到 Ant 脚本中的目标:

  • 通过在项目的“项目属性”对话框中调整“生成和运行”页中的设置。
  • 通过令 IDE 为你生成一个目标,然后按需定制该目标。这对“调试项目”和“编译文件”命令有效。在项目中首次运行那些命令时,IDE 可生成这些目标。
  • 通过手动编辑项目的 project.xml 文件。

在“项目属性”对话框中映射 IDE 命令

“项目属性”对话框是用来在 IDE 中配置自由格式项目的主要工具。要打开该对话框,在“项目”窗口中,右键单击 自由格式项目节点(图标),然后选择“属性”。在“生成和运行”页中,可为下列命令设置要运行的 Ant 目标:

  • 生成项目
  • 清理项目
  • 生成 Javadoc
  • 运行项目(自由格式 Java 项目)
  • 部署项目(自由格式 Web 项目)
  • 测试项目

注意:如果 Ant 脚本使用 import 语句从另一个 Ant 脚本导入目标, 这些目标不会显示在“项目属性”对话框中的下拉列表。要将命令映射到这些目标,就必须 将目标的名称键入到下拉列表。

还可以在“定制菜单项”列表中,为 Ant 脚本中的任何目标向项目节点的上下文菜单添加快捷键。

project.xml 中映射 IDE 命令

每个 IDE 项目都有一个 project.xml 文件,其中包含有关项目的重要元数据、项目 Ant 脚本的位置、为 IDE 命令运行哪些目标,以及其他信息。如果要映射 IDE 中工作于当前选定文件上的命令,或者要将命令映射到单独的 Ant 脚本中的目标,就必须动手编辑 project.xml 文件。在“文件”窗口中,依次展开项目的根文件夹和 nbproject 文件夹,然后双击 project.xml

ide-actions 元素持有 IDE 命令的映射。输入带任何标准 IDE 操作名称的 action 元素,并定义要将命令映射到的脚本和目标。

可使用下列标准 IDE 操作:

  • build - 生成项目(F11)
  • rebuild - 清理并生成项目(Shift-F11)
  • compile.single - 编译选定文件(F9)
  • clean - 清理项目
  • run - 运行项目(F6)
  • run.single - 运行选定文件(Shift-F6)
  • redeploy - 用于 Web 应用程序项目:生成项目、从服务器取消部署项目,和将项目部署到服务器
  • test - 为项目运行 JUnit 测试(Alt-F6)
  • test.single - 为选定文件运行 JUnit 测试(Ctrl-F6)
  • debug.test.single - 为选定文件调试 JUnit 测试(Ctrl-Shift-F6)
  • debug - 在调试器中运行项目(F5)
  • debug.single - 调试选定文件(Ctrl-Shift-F5)
  • debug.fix - 运行“应用代码更改”命令以在调试会话过程中重新装入选定文件
  • debug.stepinto - 在调试器中执行项目主类中的一行并暂停(F7)
  • javadoc - 为项目生成 Javadoc

例如,下面将“调试项目”映射到项目 Ant 脚本的 debug-nb 目标:

<action name="debug">
    <target>debug-nb</target>
</action>
            

NetBeans IDE 命令的 Ant 脚本不须位于用来生成和运行项目的同一个 Ant 脚本中。这对不想修改 Ant 脚本的用户有用。下面将“调试项目”映射到一个单独的 Ant 脚本中的 debug-nb 目标:

<action name="debug">
    <script>path/to/my/nbtargets.xml</script>
    <target>debug-nb</target>
</action>

注意:<script> 必须在 <target> 之前。

还可以配置一个命令来运行多个目标。这些目标按它们出现在操作中的顺序运行。例如,映射“清理并生成项目”的命令看起来像这样:

<action name="rebuild">
    <target>clean</target>
    <target>compile</target>
</action>

将快捷键添加到项目节点的上下文菜单

project.xml 还有一个 context-menu 元素,它控制项目节点上下文菜单的内容。如果手动添加一个运行在项目上的操作,需确保也将操作名称注册到 <context-menu> 中。如果使用“项目属性”对话框来配置标准项目命令,IDE 会自动将命令添加到项目的上下文菜单。

编辑 project.xml 文件

每个 IDE 项目都有一个 project.xml 文件,其中包含有关项目的重要信息,例如:

  • 项目命令与 Ant 脚本中目标之间的映射。
  • 有关项目内容、类路径和目标 Java 平台的信息。此信息用于可视化项目以及启用代码完成和重构。

project.xml 文件中使用属性

可以在 project.xml 文件自身内部定义属性,也可以将属性存储在单独的 .properties 文件中。将 project.xml 文件与 Ant 脚本中的信息保持同步的一种方法是:将 Ant 脚本所用的 .properties 文件中的属性导入到 project.xml 中。

然而要注意,project.xml 中的所有文件路径都缺省相对于项目文件夹。如果 Ant 脚本不在项目文件夹中,指向 build/classes/classdir 属性就不会为 Ant 脚本和 project.xml 文件指向相同的目录。(项目文件夹是指包含 nbproject 文件夹的文件夹,而不是 nbproject 文件夹本身。缺省情况下,新建自由格式项目向导使 Ant 脚本的副文件夹成为项目文件夹。)

可通过为重要路径(像 project.dir)定义属性并让这些属性更准确来解决此问题(例如,classdir=${project.dir}/build/classes)。

要在 project.xml 中创建和导入属性,需要在 name 元素和 folders 元素之间输入以下内容:

<properties>
    <property name="name">value</property>
    <property-file>my-properties-file.properties</property-file>
    <property-file>another-properties-file.properties</property-file>
</properties> 

注意语法和 Ant 脚本中使用的语法不同。还要注意尽管可以按任意顺序添加属性,但这些属性只能引用此前已在 project.xml 中定义的其他属性。属性文件路径本身也可以使用属性替换。

验证 project.xml 文件

IDE 与自由格式 project.xml 文件的 XML 架构捆绑在一起,在每次编辑和保存自由格式的 project.xml 文件时,IDE 都会自动对其进行验证。您可以在以下位置查看自由格式 project.xml 文件的 XML 架构:

创建目标以调试 Java SE 应用程序

与编译命令和运行命令相似,调试命令依赖各种不同的信息,如源位置、编译类和其他项在类路径中的位置,以及项目主类的名称。

在自由格式项目中,IDE 并不“了解”其中的任何内容。在 IDE 中运行命令(如“生成”)时,IDE 仅调用生成脚本中的目标,然后由该脚本处理命令。因此,要使调试正常运行,您还必须具有一个用于调试的生成脚本目标。IDE 提供了一些使用调试器的 Ant 定制任务,并且还可以生成基本的调试目标,该目标尝试基于脚本中的其他目标来提供重要的详细信息。

要在自由格式项目中设置调试,需要执行以下操作:

  • 确保使用所包含的调试信息来编译类。例如,可以通过在 <javac> 任务中包含参数 debug="true",在生成脚本的 compile 目标中完成此操作。
  • 如果自由格式项目的输出在另一个项目的类路径中,则需要将自由格式项目的源包映射到其输出中。这可确保在对自由格式项目具有依赖关系的项目中启动调试会话时,使用调试器步入自由格式项目的源。可以在自由格式项目的“项目属性”对话框的“输出”面板中执行此操作。通过在“项目”窗口中右键单击项目节点并选择“属性”,可以打开“项目属性”对话框。
  • 在生成脚本中创建调试目标,然后将该目标映射到 IDE 的“调试项目”命令。IDE 可以帮助你生成基本目标和映射,但你可能需要修改该目标。

创建调试目标

如果没有为项目编写 debug 目标,则在第一次尝试调试项目时,IDE 将为你生成一个基本目标。然后你可以检查该目标,并对该目标进行定制以满足项目的特定需求。

注意:在生成调试目标前,最好先确保有映射到“运行项目”命令的目标。当 IDE 生成调试目标时,它在已映射到“运行项目”命令的目标中查找相关信息以确定运行类路径和项目的主类等。如果已将某个目标映射到“运行项目”命令,则很可能不需要进一步定制就可以使用生成的调试目标。

为自由格式项目创建调试目标:

  1. 在“项目”窗口中,右键单击项目节点,然后选择“设置为主项目”。
  2. 选择“调试”>“调试主项目”。
  3. 在出现的“调试项目”对话框中,单击“生成”。

    将在名为 ide-targets.xml 的文件中创建一个名为 debug-nb 的目标。生成的 ide-targets.xml 文件是一个用于导入主 build.xml 文件的生成脚本,因此,调试目标可以利用主生成脚本设置或引用的目标和属性。

    此外,还会在 project.xml 文件中创建该目标的映射,以便在 IDE 中选择“调试项目”命令时调用该目标。如果从头开始编写目标,还需要自行创建该映射。参见手动将目标映射到菜单项

  4. 验证生成的 debug-nb 目标是否适当地兼顾了项目的所有元素。特别是,如果目标未在运行类路径中包含所有项,则可能需要在目标中修改 <classpath> 参数。

在创建目标后,便可以开始调试了。开始调试:

  1. 在主类中设置一个断点。单击要设置断点的行的左侧空白处,可以完成此操作。具有断点的行将以粉红色突出显示。
  2. 重新右键单击项目的节点,然后选择“调试项目”。

    将运行目标并开始执行程序。目标的运行进度将显示在“输出”窗口中,而调试器的状态则显示在“输出”窗口底部的状态栏中。

典型的自由格式项目调试目标

生成的 Ant 目标将执行以下操作:

  • 使用 nbjpdastart 任务启动调试器。
  • jpda.address 属性(addressproperty="jpda.address")中存储调试器侦听应用程序时所在的地址。不必在 Ant 脚本或属性文件中定义 jpda.address 属性。该属性是由 IDE 定义的。
  • 建立运行时类路径。如果 IDE 无法确定运行时类路径,则会在脚本中放置一些占位符,你需要亲自填充这些值。
  • 在调试模式下运行应用程序,设置 fork="true" 可确保进程在单独的虚拟机中启动。

注意:还可在 java 中附加任何 JVM 参数或程序参数。

生成的调试目标(IDE 能够猜测出运行时类路径)会按以下方式显示,其中,斜体项表示特定于具体项目的值:

<?xml version="1.0" encoding="UTF-8"?>
    <project basedir=".." name="YourProjectName">
    <import file="../build.xml"/>
    <!-- TODO: edit the following target according to your needs -->
    <!-- (more info: https://netbeans.org/kb/archive/index.html) -->
    <target name="debug-nb">
    <nbjpdastart addressproperty="jpda.address" name="NameOfProject" transport="dt_socket">
    <classpath path="ClasspathSpecifiedInYourRunTarget"/>
    </nbjpdastart>
    <java classname="MainClassSpecifiedInRunTarget" classpath="ClasspathSpecifiedInYourRunTarget" fork="true">
    <jvmarg value="-Xdebug"/>
    <jvmarg value="-Xnoagent"/>
    <jvmarg value="-Djava.compiler=none"/>
    <jvmarg value="-Xrunjdwp:transport=dt_socket,address=${jpda.address}"/>
    </java>
    </target>
</project>
            

如果尚未映射运行目标,或者 IDE 无法确定项目的类路径或主类,则生成的调试目标会包括“TODO”占位符,你可以按以下示例填充这些值。

<?xml version="1.0" encoding="UTF-8"?>
    <project basedir=".." name="YourProjectName">
    <!-- TODO: edit the following target according to your needs -->
    <!-- (more info: https://netbeans.org/kb/archive/index.html) -->
    <target name="debug-nb">
    <path id="cp">
    <!-- TODO configure the runtime classpath for your project here: -->
    </path>
    <nbjpdastart addressproperty="jpda.address" name="NameOfProject" transport="dt_socket">
    <classpath refid="cp"/>
    </nbjpdastart>
    <!-- TODO configure the main class for your project here: -->
    <java classname="some.main.Class" fork="true">
    <classpath refid="cp"/>
    <jvmarg value="-Xdebug"/>
    <jvmarg value="-Xnoagent"/>
    <jvmarg value="-Djava.compiler=none"/>
    <jvmarg value="-Xrunjdwp:transport=dt_socket,address=${jpda.address}"/>
    </java>
    </target>
</project>
            

要指定运行时类路径,需要在 path 元素中插入 pathelement 元素,并将它们指向包含类路径项的目录。例如,可以使用 pathelementlocation 属性来指定类路径项相对于项目目录的位置。项目目录通常是包含项目的 build.xml 文件的目录。下面是一个示例:

<path id="cp">
    <pathelement location="libs">
    <pathelement location="build">
</path>
            

手动将目标映射到菜单项

在 IDE 为您生成某个目标时,IDE 会自动提供该目标与 IDE 命令的菜单项之间的映射。但是,如果手动创建目标,则还需要手动创建映射。

将“调试项目”命令映射到外部 Ant 脚本中的目标:

  1. 打开项目的 project.xml 文件,并将以下代码添加到 <ide-actions> 中:
        <action name="debug">
            <script>path_to_Ant_script</script>
            <target>target_name</target>
        </action>
                        
  2. 通过将下面一行添加到 <context-menu> 目标中,可以将命令添加到项目节点的上下文菜单中:
        <ide-action name="debug"/>
                        
    IDE 会将“调试项目”操作映射到项目 Ant 脚本中的指定目标。

创建目标以调试 Web 应用程序

现在来看一个将调试器附加到 Web 应用程序上的目标。首先,选择“调试”>“调试主项目”(Ctrl-F5)。 如果未将任何目标映射到“调试”命令,系统会提示你让 IDE 在 nbproject/ide-targets.xml 文件中生成特定于 IDE 的调试目标。单击“生成”时,将生成 debug-nb 目标,同时还生成 -load-props-check-props-initdebug-display-browser 目标,它们用来支持调试目标。目标在“源编辑器”中显示为以下内容:

注意:这些目标不在 IDE 中生成。因此,你需要将生成的代码更改成下面的样子。)

    <target name="-load-props">
        <property file="nbproject/project.properties"/>
    </target>

    <target name="-check-props">
        <fail unless="session.name"/>
        <fail unless="jpda.host"/>
        <fail unless="jpda.address"/>
        <fail unless="jpda.transport"/>
        <fail unless="web.docbase.dir"/>
        <fail unless="debug.sourcepath"/>
        <fail unless="client.url"/>
    </target>

    <target depends="-load-props, -check-props" name="-init"/>

    <target depends="-init" name="debug-nb" description="Debug Project">
        <nbjpdaconnect address="${jpda.address}" host="${jpda.host}" name="${session.name}" transport="${jpda.transport}">
            <sourcepath>
        <path path="${debug.sourcepath}"/>
            </sourcepath>
        </nbjpdaconnect>
        <antcall target="debug-display-browser"/>
    </target>

    <target name="debug-display-browser">
        <nbbrowse url="${client.url}"/>
    </target>
        

你不需要定制生成的目标。你必须做的一切就是设置属性,IDE 需要用它们来使用生成的目标。例如,你需要告诉 IDE 应用程序源的位置。为此,需要在 IDE 在创建上面的 debug-nb 目标时创建的 nbproject/debug.properties 文件中设置属性。使用上面的 -load-props 目标,IDE 将装入运行 debug-nb 目标时的属性。

注意:该文件不会在 IDE 中生成。你需要转至“文件”窗口,展开项目节点,右键单击 nbproject 文件夹,然后选择“新建”>“文件/文件夹”。选择“其他”>“属性文件”,将文件命名为 debug,然后单击“完成”。在新建的 debug.properties 文件中,添加下列属性。)

    jpda.session.name=MyProject
    jpda.host=localhost

    # Sun Java System Application Server using shared memory (on Windows)
    # jpda.address=localhost4848
    # jpda.transport=dt_shmem

    # Sun Java System Application Server using a socket
    # jpda.address=9009
    # jpda.transport=dt_socket

    # Tomcat using shared memory (on Windows)
    jpda.address=tomcat_shared_memory_id
    jpda.transport=dt_shmem

    # Tomcat using a socket
    #jpda.address=11555
    #jpda.transport=dt_socket

    src.folders=src
    web.docbase.dir=web

    # you can change this property to a list of your source folders
    debug.sourcepath=${src.folders}:${web.docbase.dir}

    # Client URL for Tomcat
    client.url=http://localhost:8084/MyProject

    # Client URL for Sun Java System Application Server
    # client.url=http://localhost:8080
        

下表解释了上面定义的属性。

属性 注意
jpda.session.name 调试项目时在“会话”窗口中的显示名称。
jpda.host 要调试的程序的主机,用来连接到调试器,比如 localhost
jpda.address 绑定的 Tomcat Web 服务器缺省值,套接字连接为 11555,共享内存连接为 tomcat_shared_memory_id 要设置不同的地址,在“服务”窗口中右键单击“Tomcat”节点,然后选择“属性”。在“属性”表单中,更改“调试端口”属性(对套接字连接)或“名称”属性(对共享内存连接)。然后关闭“属性”表单。如果已经启动了 Tomcat Web 服务器,现在就停止并重启。
jpda.transport dt_socket(对套接字连接)或 shmem(对共享内存连接)。 要设置不同的传输,在“服务”窗口中右键单击“Tomcat”节点,然后选择“属性”。在“属性”表单中,更改“调试类型”。然后关闭“属性”表单。如果已经启动了 Tomcat Web 服务器,现在就停止并重启。
web.docbase.dir
src.folders
Web 根(web.docbase.dir)和 Java 源文件(src.folders)的位置。 多个源根可以在预案路径中以“:”分隔符的方式包含。注意 Java 源文件夹必须在“项目属性”对话框的“Java 源”面板中指定为“源包文件夹”。(右键单击项目,选择“属性”,然后在“项目属性”对话框中单击“Java 源”。)
client.url 需要在 IDE 的缺省浏览器中打开的 URL,比如 http://localhost:8084/MyProject

注意 debug-nb 目标被自动映射到“调试项目”命令。然而,如果你将此目标放在不同的 Ant 脚本中,就需要打开项目的 project.xml 文件,然后在 ide-actions 段更改 script 元素:

<action name="debug">
    <script>path-to-my-debug-target.xml</script>
    <target>debug-nb</target>
</action>

使用调试目标

在能够使用调试目标前,需要部署应用程序。因此,启动服务器并运行部署应用程序。注意首次逐会话运行应用程序时,Tomcat Web 服务器会向你询问用户名和口令。唯一可接受得用户名和口令是具有“manager”角色的用户。这在 Tomcat Web 服务器主目录中的 conf/tomcat-users.xml 文件中定义。要确定该目录的位置,在“服务”窗口中右键单击 Tomcat Web 服务器实例,然后选择“属性”。在“属性”对话框中,“主目录”属性指向 Tomcat Web 服务器的主目录。

一旦应用程序已被部署,停止服务器并以调试模式启动。完成的方式和服务器有关:

  • 捆绑的 Tomcat Web 服务器

    在“服务”窗口展开“服务器”节点,右键单击“捆绑的 Tomcat”节点,选择“启动/停止服务器”,然后单击“启动服务器(调试)”。

  • 外部 Tomcat Web 服务器

    运行以下命令:

        catalina jpda start
                

一旦服务器以调试模式启动,就选择“运行”>“调试主项目”(F5)。应用程序将被部署然后附着到调试器。调试器在第一个断点停止,然后就可以“步入”(F7)或“越过”(F8)代码。

调试目标疑难解答

虽然 IDE 尽可能为你生成完整的调试目标,并带有最适合你的特定环境的属性,你也始终应当分析和微调调试过程。如果在使用 NetBeans IDE 生成的 Ant 调试目标时遇到问题,可通读下列问题:

Web 应用程序被正确部署了吗?

检查 Web 应用程序已被部署:

  1. 在“服务”窗口中,展开“服务器”节点,启动服务器(如果没启动),展开服务器实例的节点,然后展开“Web 应用程序”节点。
  2. 如果看不到应用程序的上下文(对本文档中的应用程序来说是 /MyProject),就没有被正确部署。
  3. 部署应用程序。

你在防火墙后面吗?

检查你的代理设置是否正确。根据你的代理类型,进行以下操作:

  • HTTP 代理。选择“工具”>“设置向导”。在向导中,选择“使用 HTTP 代理”复选框。在“代理服务器名称”字段中键入代理主机名,“端口”字段中键入端口号。单击“完成”。
  • SOCKS 代理。你必须在启动 IDE 时,将 SOCKS 代理主机名和代理端口参数传给 JVM 软件。在 Microsoft Windows 机器上,使用 IDE-HOME/etc/netbeans.conf 文件来传递参数。在 UNIX 和 Linux 机器上,可编写一个包装器外壳脚本。 有关详细信息,可转至“帮助”>“帮助内容”。

服务器以调试模式运行吗?

检查服务器是否以调试模式启动:

  1. 在“服务”窗口中,展开“服务”节点并检查服务器是否在运行。注意即使它在运行,也可能没有以调试模式运行。
  2. 如果没有运行,右键单击,选择“启动/停止服务器”,然后单击“启动服务器(调试)”。如果正在运行,但不确定是否以调试模式运行,停止服务器并以调试模式重启。

服务器的端口和地址设置正确吗?

检查 debug.properties 中设置的 jpda.address 是否匹配服务器的设置:

  1. 在“服务”窗口中,右键单击服务器节点,然后选择“属性”。
  2. 在“属性”表单中:
    • 检查“调试端口”属性(对于套接字连接)。缺省情况下,对 SJS 应用程序服务器应当是 9009,Tomcat Web 服务器是 11555
    • 检查“名称”属性(对于共享内存连接)。缺省情况下,对 SJS 应用程序服务器应当是 localhost4848,Tomcat Web 服务器是 tomcat_shared_memory_id
    如果更改了服务器的“调试端口”属性或“名称”属性,需确保它匹配 debug.properties 文件中的相关属性。
  3. 关闭“属性”表单,如果已经启动服务器,就停止并重启。

检查 debug.properties 中设置的 jpda.transport 是否匹配服务器的设置:

  1. 在“服务”窗口中,右键单击服务器节点,然后选择“属性”。
  2. 在“属性”表单中,检查“调试类型”属性:
    • 对于套接字连接是 dt_socket
    • 对于共享内存(Windows)是 dt_shmem
    如果更改了服务器的“调试类型”属性,需确保它匹配 debug.properties 文件中的相关属性。
  3. 关闭“属性”表单,如果已经启动服务器,就停止并重启。

无法在代码中步进?

如果无法在代码中逐行步进,而只能逐断点,表明 IDE 无法找到源。这是因为没有正确指定源。

  • Servlets:选择“窗口”>“调试”>“源”。“源”窗口显示所有可用于调试的 Java 源文件夹。如果要调试不能在“源”窗口中找到的源文件夹,就需要在“项目属性”对话框中指定:
    1. 右键单击项目节点,选择“属性”,单击“Java 源”。
    2. 将要调试的源文件夹添加到“源包文件夹”表格或“测试包文件夹”表格。
    注意在调用 javac 任务时,用来编译 Servlet 的目标必须指定 debug="true"。如果 Servlet 被编译成不带调试信息,调试器就不会在断点停下。
  • JSP 页:确保已为项目定义了上下文路径:
    1. 右键单击项目节点,选择“属性”,单击“Web 源”。
    2. 键入上下文路径,例如,在“上下文路径”字段中键入 /MyProject

    注意,如果已经在指定上下文路径设置了断点,就必须删除它们,并在指定上下文路径后重设。换句话说,必须先设置上下文路径。

同时确保在 debug.properties 文件和 debug-nb 目标中正确指定了源。注意,如果 nbproject 文件夹没有放在源文件夹所放的文件夹内,就必须为 src.folderweb.docbase.folders 属性设置以下属性:

  • src.folders=${project.dir}/src
  • web.docbase.dir=${project.dir}/web

回到页首

创建目标以编译单个文件

如果想能够在 IDE 中选择文件并单独编译它们,则需要使用 Ant 目标来执行此命令。第一次选择该命令时,IDE 将为你生成一个目标。生成的目标看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<project basedir=".." name="MyProjectName">
    <!-- TODO: edit the following target according to your needs -->
    <!-- (more info: https://netbeans.org/kb/archive/index.html) -->
    <target name="compile-selected-files-in-src">
        <fail unless="files">Must set property 'files'</fail>
        <!-- TODO decide on and define some value for ${build.classes.dir} -->
        <mkdir dir="${build.classes.dir}"/>
        <javac destdir="${build.classes.dir}" includes="${files}" source="1.5" srcdir="src"/>
    </target>
</project>
        

在生成的目标中,需要指定用于放置编译类的目录。可通过在生成的目标中指定 build.classes.dir 属性的值来执行此操作。例如,可以将下面一行添加到 <target name="compile-selected-files-in-src"> 条目上面的一行中:

<property name="build.classes.dir"  value="build"/>

或者,可以替换所提供的 build.classes.dir 值,还可以完全重新编写目标。

includes 参数的值就是生成的 files 参数的值。IDE 使用该属性来存储当前选定文件的名称。

注意:可以配置多个 compile.single 操作,以便根据选定文件,用不同的功能来重载 F9 快捷键和菜单命令。例如,可为 JUnit 测试类设置一个单独的 compile-selected-files 目标,然后对 JUnit 测试目录中的所有源,将 compile.single 映射到此目标。或者可以更改到 \.xml$ 的模式,并且对所有 XML 文件,将 F9 映射到“验证 XML”目标。

编写目标以运行/调试/测试单个文件

IDE 不会为“运行文件”、“测试文件”和“为文件调试测试”命令生成目标,但可以创建自己的目标,然后将它们映射到以下预定义的操作:

  • run.single - 运行选定文件(Shift-F6)
  • debug.single - 调试选定文件(Ctrl-Shift-F5)
  • test.single - 为选定文件运行 JUnit 测试(Ctrl-F6)
  • debug.test.single - 为选定文件调试 JUnit 测试(Ctrl-Shift-F6)

这些操作中,每个都包含一个 context 元素,它可获取当前选定文件的引用并将你的选择保存到一个属性中。可在 Ant 目标中使用此属性来指定哪些文件需要处理。

运行选定的文件

我们演示一下运行一个类时是如何工作的。一个用来运行项目的典型目标看起来像下面这样:

    <target name="run2" depends="...">
        <java fork="true" classname="MyMainClass" classpath="MyRunClasspath" />
    </target>
            

目标根据 classname 运行指定的文件。要在 IDE 中运行当前选定的文件,你需要将上面的目标修改为下面的样子:

    <target name="run-selected-file" depends="compile" description="Run Single File">
        <fail unless="runclass">Must set property 'classname'</fail>
        <java classname="${runclass}">
            <classpath refid="run.classpath"/>
        </java>
    </target>
            

在 IDE 中获取当前选定文件的引用

一旦有了运行选定文件的 Ant 目标,就必须在 IDE 中获取到那个文件的引用,并存储到一个属性中。例如,上面的 run-selected-file 目标在 runclass 属性中寻找当前选中的文件。

将此引用存储到和将生成目标映射到 IDE 操作(run-selected-file)相同的位置。我们先看看如何做,然后下详细解释:

    <action name="run.single">
        <target>run-single</target>
        <context>
            <property>runclass</property>
            <folder>${src.dir}</folder>
            <pattern>\.java$</pattern>
            <format>java-name</format>
            <arity>
                <one-file-only/>
            </arity>
        </context>
    </action>
            

runclass 属性是新定义的,它持有要运行的文件,并被 java 任务引用。

现在看看下面几行来了解工作方式。

    <action name="run.single">
        <target>run-selected-file</target>
        <context>
    <property>runclass</property>
            
  • <action name="run.single"> 映射“运行文件”命令,F9 快捷键映射 run-selected-file 目标。
  • <context> 设置 Ant 目标运行在其上的上下文。本例中为要运行的文件的名称。
  • runclass 是持有上下文的属性名称。可为该属性选择任何唯一的名称。该属性必须在目标运行前由 IDE 设置。
  • <arity> 指定 runclass 只能持有一个文件。 如果想要该属性能够持有一个以上的文件(例如对“编译文件”目标),可使用下列代码,逗号(,)是文件名称的分隔符:
        <arity>
            <separated-files>,</separated-files>
        </arity>
                        
  • <format>java-name</format> 指定 IDE 应当将相对文件名称传递给目标, 但由点号(.)分界,并不带扩展名。其他格式化选项如下所示:
    • relative-path - 指定IDE 应当将相对文件名称传递给目标
    • relative-path-noext - 同 relative-path,但删除了文件扩展名
    • absolute-path - 绝对文件名
    • absolute-path-noext - 同 absolute-path,但删除了文件扩展名
  • <folder>${src.dir}</folder> 指定文件名必须相对于 src.dir 目录,且该操作只对 src.dir 目录启用。

    注意:IDE 不会为你定义 ${src.dir} 属性。必须定义该属性,或导入 Ant 在 project.xml 中使用的 .properties 文件。参见project.xml 文件中使用属性

  • <pattern>\.java$</pattern> 是文件名称必须通过的正则表达式。使用 <pattern> 来限制哪些文件可以传给 Ant 目标。本例中,你将要让目标只能用 .java 结尾的文件来运行。

调试选定的文件

过程基本上和编写目标以调试和运行单个文件相同。debug-selected-files 目标看起来像这样:

    <target name="debug-selected-files" depends="compile" if="netbeans.home" description="Debug a Single File">
        <fail unless="classname">Must set property 'classname'</fail>
        <nbjpdastart name="${classname}" addressproperty="jpda.address" transport="dt_socket">
            <classpath refid="run.classpath"/>
            <!-- Optional - If source roots are properly declared in project, should
            work without setting source path.
            <sourcepath refid="debug.sourcepath"/> -->
        </nbjpdastart>
        <java classname="${classname}" fork="true">
            <jvmarg value="-Xdebug"/>
              <jvmarg value="-Xnoagent"/>
              <jvmarg value="-Djava.compiler=none"/>
              <jvmarg value="-Xrunjdwp:transport=dt_socket,address=${jpda.address}"/>
              <classpath refid="run.classpath"/>
        </java>
    </target>
            
  • 这基本和 debug 目标相同。不将主类,而是将 classname 属性传递给 java,它被 IDE 设置为当前选定的文件。

然后将 debug-selected-files 目标映射到 debug.single操作:

    <action name="debug.single">
        <target>debug-selected-files</target>
        <context>
            <property>classname</property>
            <folder>${src.dir}</folder>
            <pattern>\.java$</pattern>
            <format>java-name</format>
            <arity>
                <one-file-only/>
            </arity>
        </context>
    </action>
            
  • <property> 现在在 classname 属性中存储上下文。
  • 既然 java 只能处理单个文件,就将 <arity> 设置为 <one-file-only>
  • <format> 设置为 java-name,使它相对于 src.dir 可为当前选定的文件创建全限定类名。

    注意:IDE 不会为你定义 ${src.dir} 属性。必须定义该属性,或导入 Ant 在 project.xml 中使用的 .properties 文件。参见project.xml 文件中使用属性

回到页首

为“应用代码更改”命令编写目标

“应用代码更改”允许你在调试会话过程中更改代码,并无需重启应用程序,并用更改的代码继续调试。IDE 包含一个 nbjpdareload 任务,你可用来为“应用代码更改”命令编写目标。

一个“修复”命令的典型目标看起来像这样:

    <target name="debug-fix">
        <javac srcdir="${src.dir}" destdir="${classes.dir}" debug="true" >
            <classpath refid="javac.classpath"/>
            <include name="${fix.file}.java"/>
        </javac>
        <nbjpdareload>
            <fileset dir="${classes.dir}">
                <include name="${fix.file}.class"/>
            </fileset>
        </nbjpdareload>
    </target>
        
  • 目标使用 ${fix.file} 属性来编译当前选定的文件。(下一节中,你将设置 IDE 以在该属性中存储当前选定文件的名称。)
  • nbjpdareload 任务在应用程序中重新装入修正的文件。

要将该目标挂接到“应用代码更改”命令(和前一个版本的 IDE 中的“修复”命令相同),需在 project.xml 中的 <ide-actions> 中定义以下操作:

    <action name="debug.fix">
        <target>debug-fix</target>
        <context>
            <property>fix.file</property>
            <folder>${src.dir}</folder>
            <pattern>\.java$</pattern>
            <format>relative-path-noext</format>
            <arity>
                <one-file-only/>
            </arity>
        </context>
    </action>
        
  • <property> 现在在 fix.file 属性中存储上下文。
  • 因为一次只能在一个文件上运行“修复”命令,可将 <arity> 设置为 <one-file-only>
  • 必须将 .java 文件的完整路径传给 javac 任务,.class 文件的完整路径传给 nbjpdareload 任务。所以要将 <format> 设置为 rel-path-noext,然后根据需要,在 debug-fix 目标中追加 .class.java

    注意:IDE 不会为你定义 ${src.dir} 属性。必须定义该属性,或导入 Ant 在 project.xml 中使用的 .properties 文件。有关更多信息,参见project.xml 文件中使用属性



回到页首

Bookmark this page

del.icio.us furl slashdot technorati digg
get support for the NetBeans

Support


By use of this website, you agree to the NetBeans Policies and Terms of Use. © 2013, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo