【问题标题】:Debug a maven assembly from within Eclipse从 Eclipse 中调试 Maven 程序集
【发布时间】:2017-07-11 23:54:24
【问题描述】:

我在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 中调试时,我无法通过这种方法安装插件。

【问题讨论】:

  • 您是否正在考虑做一些与远程调试应用程序类似(或完全一样)的事情? javarevisited.blogspot.ca/2011/02/…
  • 远程调试是我目前的做法。我希望能够简单地从 eclipse 中单击运行按钮,而不是外部命令,然后远程调试。
  • 那么,链接中的文章有帮助吗?
  • 抱歉,不,这似乎正是我目前做事的方式。我想避免手动操作mvn package && tar extrace && java -jar w/debug opts。我希望 eclipse 为我做这一切。

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


【解决方案1】:

以下是一种可能做你想做的事情的方法,带有 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 %*


然后您的外部程序启动配置可能如下所示,尽管我确定您宁愿明确设置工作目录,这样您就不必在单击运行时突出显示项目。



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

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


如果您真的希望能够通过使用运行命令来执行此操作,则另一种方法是设置一个 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 的调用,这样您就不会陷入无限循环。

【讨论】:

  • 我的最终解决方案看起来有点不同,能够支持多平台/版本升级,但是我确实建立了这个实现,谢谢。我会给你赏金,并发布我的最终解决方案。
【解决方案2】:

所以我从来没有尝试过,但这里是我想试一试的方法:

在您的项目中,与 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 下选择 build.xml 的完整路径

在目标下,应自动选择目标“mytarget”。只要确保它被选中。

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

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

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

【讨论】:

  • 如果 JVM 参数没有传递给您的 jar,这可能是由于 ant 脚本中的“fork=true”。在这种情况下,我会在 之前添加以下内容:
【解决方案3】:

按照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,我可以简单地导出三个启动配置,并使用启动器本身提交它们,允许存储库的新用户简单地导入目标并在几秒钟内准备好。

【讨论】:

    猜你喜欢
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2013-08-23
    相关资源
    最近更新 更多