Maven用于构建和管理任何基于Java的项目。但是如果项目使用脚本语言会发生什么?
所有maven现在都可以使用TCL复制文件并将它们放在目标目录中的正确位置。
我的问题如下:
有没有办法设置maven来支持TCL项目?
我在互联网上搜索了很多,但我发现只有'jacl',但我真的不知道怎么用它来设置Maven。
答案 0 :(得分:3)
Tcl与Maven没有紧密集成(与Java不同)所以你必须做更多的工作。要从Maven运行Tcl脚本,最简单的方法是使用Exec Maven Plugin,但有将执行绑定到显式生命周期阶段,而不是依赖于默认值。例如,要在test
阶段运行脚本(即执行tclsh testscript.tcl anotherArgument
),请使用:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<executions>
<execution>
<id>run-tcl-tests</id>
<phase>test</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>tclsh</executable>
<arguments>
<argument>testscript.tcl</argument>
<argument>anotherArgument</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Maven啰嗦!不要忘记,您可以将大部分复杂性放在父POM中,并且可以使用属性和配置文件来做有趣的事情。
您还可以使用java
目标来运行Jacl或jTcl解释器(在子流程中)。这取决于你想要做什么。
答案 1 :(得分:2)
除非您使用jTcl,否则我不会看到Maven会做什么,除了使您的构建过程复杂化。除非你很好地理解Maven并且可以开发一些支持插件。正如您所指出的,TCL是一种脚本语言,这意味着您真正的挑战是运行时部署问题。
那么,TCL构建过程如何使部署更简单?我建议为每个目标环境构建RPM,Debian或MSI包。这些本机安装程序可以使用依赖关系管理来确保还安装了TCL解释程序。另一个有用的构建选项是starkits,它将TCL解释器捆绑在一个文件中。
构建后,这些二进制文件可以存储在Maven存储库中(如jar文件),并用作部署过程的一部分。最后不要忘记你不会被迫使用Maven作为你的构建工具。
免责声明:自从我使用TCL编程以来已经有一段时间了,所以希望这会有所帮助。
答案 2 :(得分:0)
在maven生态系统之外依赖外部构建工具是非常“不可靠的方式”。如果tclsh不可用,链接到tclsh将破坏您的构建。不是说我没有做得更糟(有时你只需要完成它并忘记“maven方式”)。幸运的是,还有另一种选择 - 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代码中(或除了零或插件中配置的其他successCodes之外的任何退出值)。希望有所帮助。