3

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

maven 现在对 TCL 所能做的就是复制文件并将它们放在目标目录中的正确位置。

我的问题如下:

  1. 代码在 TCL-> 需要解释器而不是编译器。
  2. 它看不到任何 Java 代码,因此它不会编译任何东西。
  3. 它看不到任何 Java 测试,因此它不运行它们。
  4. 没有 java 可以运行覆盖,所以 jococo 将无事可做。

有没有办法设置 maven 来支持 TCL 项目?

我在互联网上进行了很多搜索,但只找到了“jacl”,但我真的不知道如何使用它来设置 Maven。

4

3 回答 3

3

Tcl 没有与 Maven 紧密集成(不像 Java),所以你必须做更多的工作。要从 Maven 运行 Tcl 脚本,最简单的方法是使用Exec Maven 插件,但您必须自己将执行绑定到显式生命周期阶段,而不是依赖默认值。例如,要在test阶段运行脚本(即 to do 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 解释器(在子进程中)。这取决于你到底想做什么。

于 2014-01-05T21:49:20.153 回答
2

除非您使用jTcl ,否则我看不出 Maven 会做什么,除了使您的构建过程复杂化。除非你很了解 Maven 并且可以开发一些支持插件。正如您所指出的,TCL 是一种脚本语言,这意味着您真正面临的挑战是运行时部署问题。

那么,TCL 构建过程如何使部署更简单呢?我建议为每个目标环境构建 RPM、Debian 或 MSI 包。这些本地安装程序可以使用依赖管理来确保也安装了 TCL 解释器。另一个有用的构建选项是starkits,它将 TCL 解释器捆绑在一个文件中。

构建后,这些二进制文件可以存储在您的 Maven 存储库中(如 jar 文件)并用作部署过程的一部分。最后不要忘记,您并非被迫使用 Maven 作为构建工具。

免责声明:自从我用 TCL 编程以来已经有一段时间了,所以希望这会有所帮助。

于 2014-01-05T20:12:37.077 回答
0

在 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 代码中(或除零或插件中配置的其他成功代码之外的任何退出值)。希望有帮助。

于 2014-05-27T14:28:13.497 回答