2014-01-05 4 views
3

Maven предназначен для создания и управления любым Java-проектом. Но что произойдет, если проект написан на языке сценариев?Настройка Maven для языков сценариев?

Все, что может сделать maven теперь с помощью TCL, копирует файлы и помещает их в нужное место в целевом каталоге.

Моих проблемы заключаются в следующие:

  1. код в TCL-> необходимости переводчика не компилятор.
  2. Он не видит Java-код, поэтому он ничего не компилирует.
  3. Он не видит никаких тестов Java, поэтому он не запускает их.
  4. Нет java для покрытия, поэтому jococo не будет иметь ничего общего.

Есть ли способ настроить maven для поддержки проекта TCL?

Я много искал в Интернете, и я нашел только «jacl», но я действительно не знаю, как я могу использовать его для настройки Maven.

+0

Возможно, вы можете найти ответы на этот вопрос (https://eclipse.googlesource.com/dltk/org.eclipse.dltk.tcl/+/master/tcl/tests/), поскольку, как представляется, Тесты TCL в проекте maven? – t0mppa

+0

Это интересно! Но я не вижу никакого кода в TCL, просто на Java. Поправьте меня, если я это вижу неправильно. – FILIaS

+1

Вещи под '[...] core.tests/rawtests' в структуре папок, по-видимому, являются TCL. Поэтому, даже если это исходный код для инструментария Dynamic Language Toolkit для Eclipse, может быть что-то есть. Тем не менее, я ничего не знаю о TCL, поэтому не верьте мне на слово. Просто вскочил на меня, когда я быстро просмотрел Google для этой темы и подумал, что упомянул об этом, поскольку вы сказали, что не нашли ничего полезного. – t0mppa

ответ

3

Tcl не тесно интегрирован с Maven (в отличие от Java), поэтому вам придется больше работать. Чтобы запустить сценарий Tcl из Maven, самый простой способ - использовать 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

Вы также можете сделать плагин Maven для запуска Tcl, но это _way_ больше работы. (Если вы это сделаете, пожалуйста, сделайте его доступным для других и сделайте объявление на comp.lang.tcl ...) –

+0

Спасибо, Донал! Я попробую ваше решение. Если я получу его правильно, это может работать только для одного файла? или я могу установить в качестве аргумента * .tcl, что означает, что он может запускать все .tcl-файлы? – FILIaS

+1

Tcl не делает этого по умолчанию. Вам понадобится скрипт библиотеки, который принимает все имена файлов в качестве аргументов и запускает каждый из них. Грубо, без обработки ошибок: 'foreach filename $ argv {source $ filename}' или, возможно, 'foreach filename $ argv {puts [exec [info nameofexecutable] $ filename]}', но я считаю, что вам нужно будет настроить эти рецепты. Возможно, вам будет лучше задать отдельный вопрос по этому вопросу. –

2

Если вы не используете jTcl Я не вижу, что сделает Maven, кроме усложнения процесса сборки. Если вы не хорошо понимаете Maven и можете разработать некоторые поддерживающие плагины. Как вы указали, TCL - это язык сценариев, то есть ваш реальный вызов - это проблема с развертыванием .

Итак, как бы процесс сборки TCL упростил развертывание? Я бы предложил создать RPM, Debian или MSI-пакет для каждой целевой среды. Эти встроенные установщики могут использовать управление зависимостями, чтобы обеспечить инкремент TCL. Еще один вариант полезной сборки - starkits, который связывает интерпретатор TCL в одном файле.

После создания эти двоичные файлы могут быть сохранены в вашем репозитории Maven (например, файлы jar) и использованы как часть процесса развертывания. И, наконец, не забывайте, что вы не должны использовать Maven в качестве инструмента сборки.

Отказ от ответственности: Прошло некоторое время с тех пор, как я запрограммировал TCL, поэтому надеюсь, что это поможет.

+0

Спасибо, Марк. Но на самом деле ... Я вынужден использовать Maven, действительно! Это проект моей работы, и я просто пытаюсь настроить все локально, что явно больно. – FILIaS

0

Это очень «не путь maven», чтобы создавать зависимости от внешних инструментов построения вне экосистемы maven. Связывание с tclsh приведет к поломке ваших сборок, если tclsh недоступен.Не говорю, что я не сделал хуже (иногда вам просто нужно сделать это и забыть «путь на пути»). К счастью, есть альтернатива - jacl.

Сначала загрузите последний (возможно, 1.4.1) предварительно созданный двоичный файл zac-файла jacl от sourceforge.

Далее распакуйте и зайдите в подкаталог lib/tcljava1.4.1. Есть четыре фляга файлов здесь вам нужно опубликовать в локальное хранилище (или другой репо вы используете):

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> 

Тогда просто вызовите Tcl (или действительно JACL) скрипт с использованием EXEC цели ехес-Maven-плагин, передавая путь к файлу сценария в качестве первого аргумента (настроить выполнение по мере необходимости связывание с надлежащей фазой и т. д.):

<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 вызывает System.exit() в своей основной функции, поэтому он убивает jvm. С помощью этой конфигурации, вы можете провалить сборку с помощью:

package require java 
java::call System exit 1 

из вашего TCL кода (или любое значение выхода, кроме нуля или других successCodes настроенных в плагине). Надеюсь, это поможет.

Смежные вопросы