Можно ли скомпилировать проект grunt из maven?

Я пытаюсь выполнить grunt-задачи из maven без необходимости устанавливать Node.js или что-то еще. Это потому, что я не хочу, чтобы мой артефакт был упакован Дженкинсом, и я не могу установить Node.js на этой машине.

Я знаю, что легко с npm и несколькими командами, чтобы заставить его работать, но я также думаю, что его нужно легко интегрировать с maven, проблема в том, что я не знаю, с чего начать, так как я новый до npm.

Ответ 1

Да, используя frontend-maven-plugin, вы можете скомпилировать проекты Grunt через Maven (найденный через список рассылки NodeJS).

Как указывается в документации, плагин имеет следующие функции:

  • Позвольте вам сохранить свой внешний интерфейс и бэкэнд как можно более раздельно, уменьшив количество взаимодействия между ними до минимума; используя только 1 плагин.
  • Позволяет использовать Node.js и его библиотеки в процессе сборки без установки Node/NPM глобально для вашей системы сборки
  • Обеспечьте, чтобы версия Node и NPM была запущена в каждой среде сборки

Я прошел через код, и это довольно просто. Слава богу, кто-то наконец положил это вместе; это изящное решение. Репозиторий включает пример, который использует регулярный Gruntfile.js для вызова анализа jshint.

Ответ 2

ОБНОВЛЕНИЕ 2014-09-19: Это уже не самый точный ответ - пожалуйста, взгляните на некоторые другие ответы ниже. Это было точно в то время, когда я ответил на этот вопрос, но с тех пор, похоже, с этой точки зрения был достигнут значительный прогресс.

Боюсь, вам не повезло. Grunt построен с использованием node и должен быть установлен с использованием npm. Возможно, вы сможете скопировать существующую установку Grunt с другого компьютера, если вы не хотите использовать npm, но все равно будете использовать исполняемый файл grunt и все его зависимости на сервере сборки.

В дополнение к этому многие задачи Grunt реализованы как модули Node.js, и вам также придется их установить. Опять же, вы можете скопировать их с другого сервера, где вы выполнили установку Node.js/Grunt, но в какой-то момент вы должны это сделать.

Для запуска Grunt из Maven лучше всего использовать плагин Maven exec, а затем выполнить исполняемый файл grunt.

В качестве альтернативы есть несколько плагинов Maven, которые позволяют вам делать вещи, похожие на Grunt, на основе Java. Они требуют дополнительной конфигурации, несовместимой с Grunt, поэтому YMMV. Тот, который я использовал в прошлом, http://code.google.com/p/wro4j/, который поставляется с плагином Maven: http://code.google.com/p/wro4j/wiki/MavenPlugin

Любая конкретная причина, по которой вы не можете установить Node.js на свой сервер сборки?

Ответ 3

Вы можете использовать grunt-maven-plugin. Это позволяет легко интегрировать задачи Grunt в процесс сборки Maven. Нет грязных хаков.

Это то, что я использую в своем текущем проекте, и он работает просто отлично.

Ответ 4

Наконец, я закончил с этим (что достаточно близко, но не решает проблему):

<plugin>
<groupId>org.mule.tools.javascript</groupId>
<artifactId>npm-maven-plugin</artifactId>
<version>1.0</version>
<executions>
    <execution>
        <phase>generate-resources</phase>
            <goals>
                <goal>fetch-modules</goal>
            </goals>
            <configuration>
                <packages>
                    <package>grunt-cli:0.1.6</package>
                </packages>
            </configuration>
        </execution>
    </executions>
</plugin>

который устанавливает локально grunt-cli, но если я не установил node.js, это бесполезно. Хотя я пытаюсь установить node.js локально, необходимо установить python, g++ и make. Поэтому я пойду с решением KISS: установите grunt на сервере сборки.

Ссылки:
https://github.com/mulesoft/npm-maven-plugin
https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager
https://github.com/mcheely/requirejs-maven-plugin

Ответ 5

Вы можете проверить http://jhipster.github.io/: это генератор Yeoman, который генерирует приложение, в котором все Maven, Grunt и Bower работают вместе.

Это немного похоже на ваш третий вариант, но все настроено для вас, что не так просто. Он также генерирует базовые услуги AngularJS и Java REST для вас.

Ответ 6

Это полное решение для копирования/вставки, которое работает в 2017 году с использованием frontend-maven-plugin для сборки фронта и maven-war-plugin для построения войны.

Что оно делает? установите npm, bower grunt и все, что вам нужно, затем запустите npm install, bower install и, наконец, grunt build.

Вы можете удалить/добавить заменить шаги, которые вы хотите, для меня это полная 30-секундная установка/сборка библиотеки и проекта.

<dependencies>
  ...
</dependencies>

<dependencyManagement>
    <dependencies>
        <!-- https://mvnrepository.com/artifact/com.github.eirslett/frontend-maven-plugin -->
        <dependency>
            <groupId>com.github.eirslett</groupId>
            <artifactId>frontend-maven-plugin</artifactId>
        </dependency>
    </dependencies>
</dependencyManagement>

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <warSourceDirectory>src/main/webapp/YourFrontJsFolder/dist</warSourceDirectory>
                    <warName>YouWarName</warName>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <warSourceExcludes>node_modules/**</warSourceExcludes>
                    <includeScope>system</includeScope>
                    <webResources>
                        <resource>
                            <directory>WebContent/WEB-INF</directory>
                            <targetPath>WEB-INF</targetPath>
                            <includes>
                                <include>**/*.jar</include>
                                <include>**/*.jsp</include>
                            </includes>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>Cp1252</encoding>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>

    <finalName>YourAppName</finalName>
</build>

<profiles>
    <profile>
        <id>release</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>com.github.eirslett</groupId>
                    <artifactId>frontend-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <!-- optional: you don't really need execution ids, but it looks 
                                nice in your build log. -->
                            <id>install node and npm</id>
                            <goals>
                                <goal>install-node-and-npm</goal>
                            </goals>
                            <!-- optional: default phase is "generate-resources" -->
                            <phase>generate-resources</phase>

                            <configuration>
                                <nodeVersion>v7.6.0</nodeVersion>
                            </configuration>
                        </execution>

                        <execution>
                            <id>npm install</id>
                            <goals>
                                <goal>npm</goal>
                            </goals>

                            <!-- optional: default phase is "generate-resources" -->
                            <phase>generate-resources</phase>

                            <configuration>
                                <arguments>install</arguments>
                            </configuration>
                        </execution>

                        <execution>
                            <id>bower install</id>
                            <goals>
                                <goal>bower</goal>
                            </goals>

                            <configuration>
                                <!-- optional: The default argument is actually "install", so unless 
                                    you need to run some other bower command, you can remove this whole <configuration> 
                                    section. -->
                                <arguments>install</arguments>
                            </configuration>
                        </execution>

                        <execution>
                            <id>grunt build</id>
                            <goals>
                                <goal>grunt</goal>
                            </goals>

                            <!-- optional: the default phase is "generate-resources" -->
                            <phase>generate-resources</phase>

                            <configuration>
                                <!-- optional: if not specified, it will run Grunt default task 
                                    (and you can remove this whole <configuration> section.) -->
                                <arguments>build</arguments>
                            </configuration>
                        </execution>
                    </executions>

                    <configuration>
                        <installDirectory>target</installDirectory>
                        <workingDirectory>src/main/webapp/YourFrontJsFolder</workingDirectory>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
    <profile>
        <id>debug</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <id>IDE</id>
        <activation>
            <property>
                <name>m2e.version</name>
            </property>
        </activation>
        <build>
            <!-- Put the IDE build output in a folder other than target, so that 
                IDE builds don't interact with Maven builds -->
            <directory>target-ide</directory>
        </build>
    </profile>
</profiles>

Затем вы можете Run asMaven build..., с целью clean install и release профиля

Ответ 7

Первая проблема заключается в том, что Maven является Java, но Grunt.js работает во время выполнения Node.js. Самая простая интеграция, которую я когда-либо достигал между двумя, включала maven-exec-plugin. Плагин maven-exec способен выполнять сценарии .sh/.bat/.cmd, в зависимости от того, какие из них являются родными для используемой ОС. Поэтому во время сборки Maven у меня был бы, например, maven-exec-plugin script с именем optimize-js.sh, который бы просто делал что-то вроде "grunt release -force" или что-то еще. Сценарии могут быть сделаны, чтобы делать что угодно. Важно настроить maven-exec-plugin для их выполнения в правильном рабочем каталоге. Конечно, "командной строки" и "node" должны быть выполнены из командной строки.

Ответ 8

Если проблема заключается в установке NodeJS на машине Jenkins, вы можете использовать плагин NodeJS Jenkins.

https://wiki.jenkins-ci.org/display/JENKINS/NodeJS+Plugin

Мы не используем его с Maven (пока), но у нас есть ворчание.

Ответ 9

Может быть сделано с помощью exec-maven-plugin.

Определите скрипт и зависимость от grunt-cli в вашем package.json:

...
  "scripts": {
    "build": "./node_modules/.bin/grunt install"
  },
  "devDependencies": {
  "grunt-cli": "^1.2.0",
...

В вашем pom, добавьте команды для запуска:

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>X.Y.Z</version>
            <executions>
                <execution>
                    <id>exec-npm-install</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <workingDirectory>${project.basedir}</workingDirectory>
                        <executable>npm</executable>
                        <arguments>
                            <argument>install</argument>
                        </arguments>
                    </configuration>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                </execution>
                <execution>
                    <id>exec-grunt-install</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <workingDirectory>${project.basedir}</workingDirectory>
                        <executable>npm</executable>
                        <arguments>
                            <argument>run</argument>
                            <argument>build</argument>
                        </arguments>
                    </configuration>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

Теперь он будет работать на пакете mvn