从Eclipse中调试maven程序集

时间:2017-02-22 04:46:04

标签: java eclipse maven debugging maven-assembly-plugin

我在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.java类启动它,但是在Eclipse中调试时,我无法通过此方法安装插件。

3 个答案:

答案 0 :(得分:2)

以下是使用Windows示例执行操作的一种方法。部分想法来自here

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

我们的想法是在项目目录的根目录中创建一个批处理文件,并通过创建一个新的外部工具程序配置从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 %*


然后你的外部程序启动配置看起来像这样,虽然我确定你宁愿明确设置工作目录,这样你不必在点击运行时突出显示项目。

external tools config


在公共选项卡中将启动参数设置为您选择的

enter image description here

将此外部配置添加到收藏夹,以便于访问(外部工具按钮应位于任务栏上)。


如果您真的希望能够通过使用运行命令来实现这一点,那么替代方法是设置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的调用,这样就不会以无限循环结束。

答案 1 :(得分:1)

所以我从来没有试过这个,但这里是我怎么试一试:

在项目中,与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中转到Run-&gt; External Tools-&gt; External Tools Configurations

在&#34; Ant Build&#34;

下创建新配置

在Buildfile下选择build.xml的完整路径

目标目标&#34; mytarget&#34;应该是自动选择的。只需确保选中它。

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

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

现在点击“运行”。如果成功,请附加调试器。您可以通过配置“构建”选项卡进一步自动化它。我实际上会将Build选项卡配置为运行&#34; mvn clean package&#34;。但是现在你有一个蚂蚁脚本。做你想做的事: - )

答案 2 :(得分:0)

根据Braheem的建议,我可以使用exec-maven-plugin插件完成此操作,但是我稍微改了一下以使其更加独立于平台。

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

我有以下插件定义,我可以使用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%
  

从Eclipse开始,我现在有3个发布目标。

标准发布

只需运行

即可运行标准启动
mvn package verify

要进行调试,我现在需要两个启动目标

启动调试

mvn package verify -Ddebug=--debug

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

启动调试附加

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

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

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