为脚本语言设置Maven?

时间:2014-01-05 19:55:00

标签: maven tcl pom.xml jacl

Maven用于构建和管理任何基于Java的项目。但是如果项目使用脚本语言会发生什么?

所有maven现在都可以使用TCL复制文件并将它们放在目标目录中的正确位置。

我的问题如下:

  1. 代码在TCL->需要一个不是编译器的解释器。
  2. 它没有看到任何Java代码,所以它不会编译任何东西。
  3. 它没有看到任何Java测试,因此它不会运行它们。
  4. 没有java可以运行报道,因此jococo将无需做任何事情。
  5. 有没有办法设置maven来支持TCL项目?

    我在互联网上搜索了很多,但我发现只有'jacl',但我真的不知道怎么用它来设置Maven。

3 个答案:

答案 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之外的任何退出值)。希望有所帮助。