在 Maven 生态系统之外依赖外部构建工具是非常“不是 Maven 方式”。如果 tclsh 不可用,链接到 tclsh 将破坏您的构建。并不是说我没有做得更糟(有时你只需要完成它并忘记“maven way”)。幸运的是,有一个替代方案 - jacl。
首先从sourceforge下载最新的(可能是 1.4.1)预构建的 jacl 二进制 zip 文件。
接下来,解压缩并进入 lib/tcljava1.4.1 子目录。这里有四个 jar 文件,您需要发布到本地存储库(或您使用的另一个存储库):
mvn install:install-file -Dfile=tjc.jar -DgroupId=jacl -DartifactId=tjc -Dversion=1.4.1 -Dpackaging=jar
mvn install:install-file -Dfile=tcljava.jar -DgroupId=jacl -DartifactId=tcljava -Dversion=1.4.1 -Dpackaging=jar
mvn install:install-file -Dfile=jacl.jar -DgroupId=jacl -DartifactId=jacl -Dversion=1.4.1 -Dpackaging=jar
mvn install:install-file -Dfile=itcl.jar -DgroupId=jacl -DartifactId=itcl -Dversion=1.4.1 -Dpackaging=jar
您还需要将这些作为依赖项添加到您调用 tcl 脚本的项目中:
<dependency>
<groupId>jacl</groupId>
<artifactId>itcl</artifactId>
<version>1.4.1</version>
</dependency>
<dependency>
<groupId>jacl</groupId>
<artifactId>jacl</artifactId>
<version>1.4.1</version>
</dependency>
<dependency>
<groupId>jacl</groupId>
<artifactId>tcljava</artifactId>
<version>1.4.1</version>
</dependency>
<dependency>
<groupId>jacl</groupId>
<artifactId>tjc</artifactId>
<version>1.4.1</version>
</dependency>
然后只需使用 exec-maven-plugin 的exec目标调用 tcl(或真正的 jacl)脚本,将脚本文件路径作为第一个参数传递(根据需要自定义执行以绑定到正确的阶段等):
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.3</version>
<executions>
<execution>
<id>runTcl</id>
<phase>process-resources</phase>
<goals><goal>exec</goal></goals>
<configuration>
<executable>java</executable>
<arguments>
<argument>-Dbasedir=${basedir}</argument>
<argument>-classpath</argument>
<classpath/>
<argument>tcl.lang.Shell</argument>
<argument>${basedir}/src/main/scripts/myScript.tcl</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
更新:请注意,我必须使用上面的“exec”目标而不是 java 目标。那是因为 jacl 在它的 main 函数中调用了 System.exit(),所以它杀死了 jvm。使用此配置,您可以使用以下方法使构建失败:
package require java
java::call System exit 1
从您的 tcl 代码中(或除零或插件中配置的其他成功代码之外的任何退出值)。希望有帮助。