У меня есть проект в Гудзоне, который построен с Maven. Он компилирует исходный код C ++ для создания исполняемого файла, который используется в других частях проекта. Он использует инструменты Visual Studio, особенно те, которые вызывают проблемы. Когда он пытается загрузить программу midl, он не может ее найти. Если я захожу на сервер, где живет моя Хадсон, и пытаюсь запустить mvn clean install в этом конкретном проекте, я получаю:
D:\Hudson\jobs\{project-name}>mvn clean install
.
.
.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.876s
[INFO] Finished at: Mon Jan 14 21:56:18 PST 2013
[INFO] Final Memory: 8M/154M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.2.1:exec (build-tlb) on project interop: Command execution failed.
Cannot run program "midl" (in directory "D:\Hudson\jobs\{project-name}"): CreateProcess error=2, The system cannot find the file specified -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
Чтобы обойти это, загрузите инструменты Visual Studio:
D:\Hudson\jobs\{project-name}>%VS100COMNTOOLS%\vsvars32.bat
Setting environment for using Microsoft Visual Studio 2010 x86 tools.
После этого я получаю чистую сборку:
D:\Hudson\jobs\{project-name}>mvn clean install
.
.
.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7.331s
[INFO] Finished at: Mon Jan 14 21:59:06 PST 2013
[INFO] Final Memory: 13M/222M
[INFO] ------------------------------------------------------------------------
Но это не работает, когда Хадсон запускает автоматическую сборку. Я попытался загрузить этот файл bat (vsvars32.bat), выполнив:
pushd %VS100COMNTOOLS%
vsvars32.bat
popd
перед тем, как запустить процесс maven, я знаю, что это работает, потому что я вижу это в выводе консоли:
C:\Apps\MicrosoftVisualStudio-10.0\Common7\Tools>vsvars32.bat
Setting environment for using Microsoft Visual Studio 2010 x86 tools.
но всякий раз, когда он достигает точки, в которой фактически используется мидл, я получаю этот вывод после ОТКАЗА BUILD:
[INFO] o.h.m.e.h.MavenExecutionResultHandler - Build failed with exception(s)
[INFO] o.h.m.e.h.MavenExecutionResultHandler - [1] org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.2.1:exec (build-tlb) on project interop: Command execution failed.
[DEBUG] Closing connection to remote
[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.2.1:exec (build-tlb) on project interop: Command execution failed. Cannot run program "midl" (in directory "D:\Hudson\jobs\{project-name}"): CreateProcess error=2, The system cannot find the file specified -> [Help 1]
Я также установил пару переменных среды {VS100COMNTOOLS, C: \ Apps \ MicrosoftVisualStudio-10.0 \ Common7 \ Tools} на панели конфигурации Hudson. Я не знаю, что еще делать, любая помощь будет оценена.
Я наконец понял это. То, как Хадсон вызывает новую задачу, — это вызов нового окна cmd, чтобы инструменты% VS100COMNTOOLS% \ vsvars32.bat были установлены в другом экземпляре. Глядя на mvn.bat в% MAVEN_HOME% \ bin, он позволяет вам вызывать bat-файл раньше:
если существует «% HOME% \ mavenrc_pre.bat», вызовите «% HOME% \ mavenrc_pre.bat», я вызвал% VS100COMNTOOLS% \ vsvars32.bat, поэтому каждый раз, когда мы запускаем maven, также загружаются визуальные инструменты. Тем не менее, похоже, что Хадсон не запускает задачу maven, вызывая этот конкретный файл bat, он каким-то образом создает свой собственный экземпляр maven, игнорируя этот mavenrc_pre.bat. Чтобы обойти это, нужно создать задачу не как задачу Maven, а как пакетную задачу и просто вызвать:
mvn clean install
Это решило мою проблему.
Других решений пока нет …