我在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中调试时,我无法通过此方法安装插件。
答案 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 %*
然后你的外部程序启动配置看起来像这样,虽然我确定你宁愿明确设置工作目录,这样你不必在点击运行时突出显示项目。
在公共选项卡中将启动参数设置为您选择的
将此外部配置添加到收藏夹,以便于访问(外部工具按钮应位于任务栏上)。
如果您真的希望能够通过使用运行命令来实现这一点,那么替代方法是设置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之后,我可以简单地导出三个启动配置,并使用启动器本身提交它们,允许存储库的新用户只需导入目标并准备好在几秒钟内完成。