从 Eclipse 中调试 Maven 程序集

Debug a maven assembly from within Eclipse

我在 Eclipse 中有一个项目,在组装后具有以下包结构

launcher.tar.gz
 |-- launcher.jar
 |-- lib/
 |-- resources/
 |-- plugins/

这是使用maven-assembly-plugin实现的。

为了应用程序正常启动,需要一些 resources,但在最终组装之外不可用,此外,我希望能够像现在一样安装插件。

我目前的工作流程是

$ mvn [clean] package
$ cd target/launcher/
$ java -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -jar launcher.jar

一旦应用程序以挂起状态启动,我就可以附加调试器并恢复我的正常工作流程。

如何从 Eclipse 简化这个过程?

可以从我的Launcher.javaclass启动这个,但是在Eclipse中调试时,我没有能力通过此方法安装插件。

以下是您可能想要做的事情的一种方法,其中包含 Windows 的示例。部分想法来自here.

我相信有两种方法可以在 Eclipse 中使用按钮执行外部命令。一种是自定义外部工具配置,另一种可能是通过 运行 配置 maven 在 eclipse 中完成。我将首先显示外部工具配置:

想法是在项目目录的根目录中创建一个批处理文件,并通过创建一个新的外部工具程序配置从 eclipse 运行 它。

因此,例如,您的项目目录中有 launcher.bat,其中包含以下脚本:

call mvn clean package
call cd target/
call "C:\Program Files\Java\{jdkfolder}\bin\cjava.bat" -{your debug options} -jar launcher.jar


其中 cjava.bat 是您需要使用以下脚本创建的另一个批处理文件:

start /wait cmd.exe /c java %*


然后你的外部程序启动配置可能看起来像这样,虽然我确定你更愿意明确设置工作目录,这样你就不必在单击 运行.

时突出显示项目



将常用选项卡中的启动参数设置为您的选择

将此外部配置添加到您的收藏夹以便于访问(外部工具按钮应该已经在任务栏上)。


替代方法是,如果您真的希望能够通过使用 运行 命令来执行此操作,则可以设置一个 Maven exec 配置(exec-maven-plugin)并以某种方式调用脚本文件像这样,虽然我没试过。

<plugin>
                <artifactId>exec-maven-plugin</artifactId>
                <groupId>org.codehaus.mojo</groupId>
                <executions>
                    <execution>
                        <id>Launcher Remote Debug</id>
                        <phase>package</phase>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <executable>${basedir}/launcher.bat</executable>
                </configuration>
            </plugin>

然后您只需删除脚本文件中对 mvn clean package 的调用,这样您就不会陷入无限循环。

所以我从未尝试过这个,但我会如何尝试:

在您的项目中,与 pom.xml 并行,添加具有以下内容的 build.xml(Ant 脚本):

<project>
<target name="mytarget" description="runs my class" >
<java jar="target/launcher/launcher.jar"
       fork="true"
       failonerror="true"
       maxmemory="128m"
       >
</java>
</target>
</project>

现在在 Eclipse 中转到 运行->外部工具->外部工具配置

在 "Ant Build"

下创建新配置

在 Buildfile select 下 build.xml

的完整路径

在目标下,目标 "mytarget" 应该是自动 selected。只需确保选中它即可。

在 JRE 选项卡下传递您的 VM 参数

-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000

现在点击 运行。如果成功,请附加您的调试器。您可以通过配置构建选项卡进一步自动化它。我实际上会将构建选项卡配置为 运行 "mvn clean package"。但是拜托,你现在有了一个 ant 脚本。随心所欲:-)

遵循 , I was able to accomplish this using the exec-maven-plugin 插件的建议,但是我做了一些改动,使其更独立于平台。

使用 profile definitions from this answer,我可以使用 ${script.extension}.sh.bat[ 之间切换=24=]

我有以下插件定义,我可以使用 verify 目标执行,它最终将完全成为一个自定义目标。

<plugin>
    <artifactId>exec-maven-plugin</artifactId>
    <groupId>org.codehaus.mojo</groupId>
    <version>1.5.0</version>

    <executions>
        <execution>

            <id>Application Launcher</id>
            <phase>verify</phase>
            <goals>
                <goal>exec</goal>
            </goals>
        </execution>
    </executions>

    <configuration>
        <executable>"${project.build.directory}${project.artifactId}-${project.version}\bin\launcher${script.extension}"</executable>

        <arguments>
            <argument>${flags}</argument>
        </arguments>
    </configuration>
</plugin>

有了上面的插件定义,我就有了

# Launch
mvn package verify
# Calls [ launcher.bat ]

# Launch with debug flag
mvn package verify -Dflags=--debug
# Calls [ launcher.bat --debug ]

然后从我的脚本中,我可以处理 --debug 标志,并在必要时修改启动命令。

...

IF "%1"=="--debug" (

        REM add VM arguments to suspend the JVM and wait for debugger to attach
        SET vmOpts=%vmOpts% -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000

        REM some additional arguments to send to my application
        SET extOpts=%extOpts% --debug --console
)

...

REM start the launcher.jar app with assemble arguments
START java %vmOpts% -jar launcher.jar %extOpts%

From with Eclipse, I now have 3 launch targets.

标准启动

只需 运行ning

即可 运行 进行标准启动
mvn package verify

为了调试,我现在需要两个启动目标

启动调试

mvn package verify -Ddebug=--debug

这将导致应用程序启动并挂起,等待调试器附加,从这一点开始,我可以 运行 来自 eclipse 的第二个目标,它被简单地配置为

启动调试附加

这个启动目标只是 connects to a remote application,如 Eclipse 文档中所述。

运行 这个目标连接到 运行ning jvm,并且用户空间代码被恢复,允许我正常调试 - 当应用程序 运行ning 退出编译后的dist目录。


this answer 之后,我可以简单地导出三个启动配置,并使用启动器本身提交它们,允许存储库的新用户简单地导入目标并在几秒钟内准备好。