使用命令行参数中的 '<' 运行 mvn exec:exec 命令

4

我需要运行一个包含'<'字符的命令。

我可以在命令行中运行它,但是当我将其放到mvn exec中时,会出现错误。

该命令:

c:\apps\putty\plink.exe myuser@myhost -T -ssh -2 $SHELL /dev/stdin 'a b c d' < test.sh

test.sh:

#!/bin/bash
echo "execution parameters: $@"

命令行输出:

执行参数:a b c d

pom.xml 文件:

<plugin> 
                <groupId>org.codehaus.mojo</groupId> 
                <artifactId>exec-maven-plugin</artifactId> 
                <version>1.4.0</version> 
                <executions> 
                    <execution>
                        <id>test</id>
                        <phase>pre-integration-test</phase>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                        <configuration><executable>c:\apps\putty\plink.exe</executable>
                            <commandlineArgs>"myuser@myhost -T -ssh -2 $SHELL /dev/stdin 'a b c d' < test.sh"</commandlineArgs>
                        </configuration>
                    </execution>
            </executions> 
        </plugin> 

我试图将“<”更改为“&lt;”,将commandlineArgs放入CDATA中,到处使用双引号("),但无法使其正常工作。

[DEBUG] Executing command line: [c:\apps\putty\plink.exe, > myuser@myhost -T -ssh -2 -pw tomcat  $SHELL /dev/stdin 'a b c d' &lt; test.sh] 
Unable to open connection: Host does not exist[INFO]
------------------------------------------------------------------------ 
[INFO] BUILD FAILURE

或者:

[DEBUG] Executing command line: [c:\apps\putty\plink.exe, myuser@myhost, -T, -ssh, -2, -pw, tomcat, $SHELL /dev /stdin 'a b c d' &lt; test.sh] 
bash: test.sh: No such file or directory [INFO]
------------------------------------------------------------------------ 
[INFO] BUILD FAILURE

我怀疑是'<'参数有问题,但我不确定是什么原因。
有什么建议吗?
更新:当我说“我尝试将'<'更改为'&lt;',将commandlineArgs放入CDATA中,到处放置双引号(“),但无法使其正常工作时”,我的意思是!

尝试过:<commandlineArgs><![CDATA[myuser@myhost -T -ssh -2 "$SHELL /dev/stdin 'a b c d' < test.sh"]]></commandlineArgs> - BTakacs
也尝试过:<commandlineArgs><myuser@myhost -T -ssh -2 "$SHELL /dev/stdin 'a b c d' < test.sh"</commandlineArgs> - BTakacs
也尝试过:<commandlineArgs><![CDATA["myuser@myhost -T -ssh -2 $SHELL /dev/stdin 'a b c d' < test.sh"]]></commandlineArgs> - BTakacs
只是为了和你在同一个页面上:你正在尝试在远程机器上执行命令,然后将其结果用作Maven的命令参数吗?从这个<commandlineArgs>"myuser@myhost -T -ssh -2 $SHELL /dev/stdin 'a b c d' < test.sh"</commandlineArgs>中,Maven不知何故得出myhost -T -ssh -2 $SHELL /dev/stdin 'a b c d' < test.sh是主机。 - Haris Osmanagić
问题不在于plink或bash,因为上面的命令行是有效的。问题是我应该如何传递给mvn exec:exec,使其运行相同的命令? - BTakacs
3个回答

1

如果我将它包装在 .bat 文件中,它就能正常工作:

@echo off
set plinkExec=%1
set env=%2
set user=%3
set pass=%4
set shellPath=%5
...

%plinkExec% %user%@%env% -T -ssh -2 -pw %pass% $SHELL /dev/stdin '...' < %shellPath%

不好看,但很神奇 :-)

1

系统命令和shell命令有所不同。管道和流重定向是shell语法。

系统命令通常只启动带有给定参数的程序,例如

  • notepad.exe myfile.txt
  • java -jar my-program.jar

系统命令可以通过各种API的简单调用来传递(例如Java的java.lang.Runtime.getRuntime().exec(),PHP的反引号等)。

然后,shell命令是处理它的特定语法,而Maven不知道您使用的shell是什么。

通常,shell提供了一种将其命令作为其可执行文件的参数执行的方法。因此,如果要使用shell命令,则需要像这样传递它:

            <configuration>
                <executable>bash</executable>
                <arguments>
                    <argument>-c</argument>
                    <argument>java -jar myprogram.jar < input.txt > output.txt</argument>
                </arguments>
            </configuration>

对于Windows操作系统来说,那就是:
            <configuration>
                <executable>path/to/cmd.exe</executable>
                <arguments>
                    <argument>/C</argument>
                    <argument>java -jar myprogram.jar < input.txt > output.txt</argument>
                </arguments>
            </configuration>

你可以使用一些跨平台的shell,例如Groovy。
希望这能帮到你。

你错过了插件的构件部分。那是一个使用exec-maven-plugin的工作示例吗? 关于Groovy提示:我已经发现了:如果你需要在Maven中执行一些复杂的操作,那么:a)你正在使用错误的工具b)你可以使用groovy-maven-plugin来完成它;-) - BTakacs
是的,这是标准 exec 插件的用法。我没有尝试过这段代码,但我记得我在 Linux 和 Windows 上都使用过它。实际上,它会变成:`bash "-c" "java ..."` - Ondra Žižka

0

你特别要求使用 mvn exec:exec。但是假设你需要运行一个带有重定向的命令,另一种方法是使用一个可以自己处理流的插件,例如 Maven Ant 插件。注意 input="..."

        <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <version>1.8</version>
            <executions>
                <execution>
                    <phase>verify</phase>
                    <goals> <goal>run</goal> </goals>
                    <configuration>
                        <target name="run">
                            <exec dir="${work.dir}" executable="java" input="input.txt">
                                <arg value="-jar"/>
                                <arg file="${project.build.directory}/${project.build.finalName}.jar"/>
                            </exec>
                        </target>
                    </configuration>
                </execution>
            </executions>
        </plugin>            

好的 :) 更新 - 添加了必要的阶段,以及如何指向构建生成的jar文件的示例。来自布尔诺对布达佩斯的问候。 - Ondra Žižka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接