行家在Linux和Windows平台上调用外部脚本(maven calls external scr

2019-07-19 17:25发布

我需要在Linux和微软Windows平台上运行的外部脚本。

  1. 难道我用的插件正确exec-maven-plugin
  2. 有没有更合适的插件?
  3. 我应该把什么文件名中的<executable>....</executable>

     <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <executions> <execution> <id>compile-jni</id> <phase>compile</phase> <goals> <goal>exec</goal> </goals> <configuration> <executable>./compile-jni</executable> <workingDirectory>${basedir}/src/main/cpp</workingDirectory> </configuration> </execution> </executions> </plugin> 

我用同样的Makefile两个平台的Linux / MS-Windows系统

我的脚本compile-jni.bat

call "%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
bash -c "make" 

我的脚本compile-jni.sh

#!/bin/sh
make

更新:

两个同事所建议的替代方案:

  1. 使用可变script.extension变化<executable>./compile-jni${script.extension}</executable>pom.xml和附加命令行内的可变mvn compile -Dscript.extention=.bat

  2. 或致电行家之前设置的Visual Studio环境变量:

     call "C:\%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86 mvn compile #(the same script 'bash -c "make"' works on both platforms) 

但在这两种解决方案,Eclipse用户可stucked ...我仍然在寻找一种自动和优雅的解决方案...

Answer 1:

最后,我混合的思想=>的<profiles>用于设置内部变量script.extension根据操作系统上:

<profiles>
  <profile>
    <id>Windows</id>
    <activation>
      <os>
        <family>Windows</family>
      </os>
    </activation>
    <properties>
      <script.extension>.bat</script.extension>
    </properties>
  </profile>
  <profile>
    <id>unix</id>
    <activation>
      <os>
        <family>unix</family>
      </os>
    </activation>
    <properties>
      <script.extension>.sh</script.extension>
    </properties>
  </profile>
</profiles>

然后,我使用变量来完成的脚本文件名:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>exec-maven-plugin</artifactId>
  <version>1.2.1</version>
  <executions>
    <execution>
      <id>compile-jni</id>
      <phase>compile</phase>
      <goals>
        <goal>exec</goal>
      </goals>
      <configuration>
        <executable>./compile-jni${script.extension}</executable>
      </configuration>
    </execution>
  </executions>
</plugin>


⚠正如注意到通过马克西姆对于行家3.5.4拉升部<configuration>如下所示:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>exec-maven-plugin</artifactId>
  <configuration>
    <executable>./compile-jni${script.extension}</executable>
  </configuration>
  <version>1.2.1</version>
  <executions>
    <execution>
      <id>compile-jni</id>
      <phase>compile</phase>
      <goals>
        <goal>exec</goal>
     </goals>
    </execution>
  </executions>
</plugin>

我从移动的工作目录pom.xml的shell脚本。 为了简化维护,常见的东西是这个壳纸条内移动。 因此,批处理文件中使用这个shell脚本:

compile-jni.bat

call "%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
bash compile-jni.sh

compile-jni.sh

#!/bin/sh
cd src/main/cpp
make


Answer 2:

运行sh脚本的例子。

这只是做一个chmod的sh脚本。 请记住,如果你有一个sh脚本,你绝对应该做一个chmod执行其它操作,例如运行实际的脚本,所以有此作为一个例子,你可以做第一个前<execution>如下,并添加另一个<execution>运行脚本。

对于批处理文件,你只能有一个<execution>运行脚本

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>${org.codehaus.mojo.version}</version>
            <executions>
               <execution>
                    <id>script-chmod</id>
                    <phase>install</phase>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                    <configuration>
                        <executable>chmod</executable>
                        <arguments>
                            <argument>+x</argument>
                            <argument>yourscript.sh</argument>
                        </arguments>
                    </configuration>
                </execution>
            </executions>
        </plugin>

你可能会想添加一个不同轮廓哪台机器上您是:

<profiles>
  <profile>
    <activation>
      <os>
        <family>!windows</family>
      </os>
    </activation>
    <plugin>
      <!-- add your exec-maven-plugin here -->
    </plugin>
    ...
  </profile>
</profiles>

希望这将是你所需要的一个开始



文章来源: maven calls external script on both Linux and Windows platforms