从Eclipse中调试maven程序集

Mat*_*ark 10 java eclipse debugging maven maven-assembly-plugin

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

launcher.tar.gz
 |-- launcher.jar
 |-- lib/
 |-- resources/
 |-- plugins/
Run Code Online (Sandbox Code Playgroud)

这是使用的maven-assembly-plugin.

为了使应用程序正常启动,有些resources是必需的,但在最终装配之外不可用,另外,我希望能够像我目前那样安装插件.

我目前的工作流程是

$ mvn [clean] package
$ cd target/launcher/
$ java -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -jar launcher.jar
Run Code Online (Sandbox Code Playgroud)

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

如何从Eclipse简化此过程?

可以从我的Launcher.java类启动它,但是在Eclipse中调试时,我无法通过此方法安装插件.

Mat*_*ark 0

按照Braheem的建议,我能够使用该exec-maven-plugin插件来完成此任务,但是我进行了一些更改以使其更加独立于平台。

使用此答案中的配置文件定义,我可以在.sh.bat${script.extension}之间进行交换

我有以下插件定义,可以使用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>
Run Code Online (Sandbox Code Playgroud)

通过上面的插件定义,我可以使用

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

# Launch with debug flag
mvn package verify -Dflags=--debug
# Calls [ launcher.bat --debug ]
Run Code Online (Sandbox Code Playgroud)

然后,我可以从我的脚本中处理该--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%
Run Code Online (Sandbox Code Playgroud)

从 Eclipse 开始,我现在有 3 个启动目标。

标准启动

只需运行即可运行标准启动

mvn package verify
Run Code Online (Sandbox Code Playgroud)

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

启动调试

mvn package verify -Ddebug=--debug
Run Code Online (Sandbox Code Playgroud)

这将导致应用程序启动并挂起,等待调试器附加,从此时起,我可以从 eclipse 运行第二个目标,它只需配置为

启动调试附加

此启动目标只是连接到远程应用程序,如 Eclipse 文档中所述。

运行此目标会连接到正在运行的 jvm,并且用户空间代码将恢复,允许我正常调试 - 当应用程序在编译后的 dist 目录中运行时。


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