Jar-манифест позволяет вам указать не более одного основного класса. Это вызывается, когда вы выполняете java
с флагом -jar
.
java -jar myapp.jar
Вы можете включить несколько основных классов в один jar, но каждый (кроме необязательного 1 выше) должен вызываться с использованием флага -classpath
и с указанием полного имени основного класса.
java -classpath myapp.jar com.mypackage.app.Main01 && \
java -classpath myapp.jar com.mypackage.app.Main02 && \
java -classpath myapp.jar com.mypackage.app.Main03
В приведенном выше примере будут созданы три отдельные виртуальные машины Java, каждая в своем собственном процессе. Очевидно, это не соответствует вашему требованию к «исполняемому банку».
В качестве альтернативы, вы можете захотеть иметь один основной метод, который запускает отдельные потоки, так что существует только один процесс, но одновременное выполнение.
Муравей не подходит для решения этой проблемы. Я подозреваю, что вам, вероятно, нужен единственный основной метод, который порождает несколько потоков. Не стесняйтесь предоставить больше информации о ваших требованиях.
..
-u"c:\Program files\Developer Express Inc\ExpressInplaceEditors\Delphi 5\Lib"
-u"c:\Program files\Developer Express Inc\ExpressQuantumGrid\Delphi 5\Lib"
..
-r"c:\Program Files\Borland\Delphi5\Lib"
-r"C:\Program Files\jvcl\jvcl\resources"
..
-i"C:\Program Files\jvcl\jvcl\run"
-i"C:\Program Files\jvcl\jcl\source"
Примечание: у нас есть политика компиляции в bin \ dcu, из exe в bin, отсюда и директивы -N, -E.
@echo on
dcc32speed -B -Q -W -H -Nbin\dcu -Ebin BpABA.dpr
@echo off
SET %Drive%=E:
:BuildServer
REM *************************************************
REM Clear files
REM *************************************************
ECHO. > "%Temp%\BuildLieven.txt"
ECHO. > "%Temp%\TestRunLieven.txt"
REM *************************************************
REM Set start time
REM *************************************************
echo | TIME | FIND "Huidige tijd" > "%Temp%\ResultLieven.txt"
REM *************************************************
REM Get latest versions
REM *************************************************
IF %LatestVersion%==1 CALL %Drive%\buildserver\latestversion.cmd
ECHO "Latest versions opgehaald" >> "%Temp%\ResultLieven.txt"
REM *************************************************
REM Build projects
REM *************************************************
CD %Drive%\Projects\
ECHO ***************************************************************** >> "%Temp%\BuildLieven.txt"
ECHO BpABA >> "%Temp%\BuildLieven.txt"
ECHO ***************************************************************** >> "%Temp%\BuildLieven.txt"
CD %Drive%\Projects\BPABA\production
ECHO Building BPABA\production
CALL Build.cmd >> "%Temp%\BuildLieven.txt"
CD %Drive%\Projects\BPABA\test
ECHO Building BPABA\test
CALL Build.cmd >> "%Temp%\BuildLieven.txt"
CD %Drive%\Projects\BPABA\test\dunit
ECHO Building BPABA\test\dunit
CALL Build.cmd >> "%Temp%\BuildLieven.txt"
ECHO BPABATests >> "%Temp%\TestRunLieven.txt"
ECHO Running BPABATests
CALL bin\BPABATests >> "%Temp%\TestRunLieven.txt"
CD %Drive%\Projects
ECHO. >> "%Temp%\BuildLieven.txt"
ECHO. >> "%Temp%\BuildLieven.txt"
ECHO. >> "%Temp%\BuildLieven.txt"
REM *****************************************************************
REM Gather (Fatal)Errors/Hints/Warnings & Failures
REM *****************************************************************
ECHO ***************************************************************** >> "%Temp%\ResultLieven.txt"
ECHO (Fatal)Errors/Hints/Warnings en Failures >> "%Temp%\ResultLieven.txt"
ECHO ***************************************************************** >> "%Temp%\ResultLieven.txt"
ECHO Fatal errors during build >> "%Temp%\ResultLieven.txt"
TYPE "%Temp%\BuildLieven.txt" | FIND /c "Fatal:" >> "%Temp%\ResultLieven.txt"
ECHO Errors during build >> "%Temp%\ResultLieven.txt"
TYPE "%Temp%\BuildLieven.txt" | FIND /c "Error:" >> "%Temp%\ResultLieven.txt"
ECHO Warnings during build >> "%Temp%\ResultLieven.txt"
TYPE "%Temp%\BuildLieven.txt" | FIND /c "Warning:" >> "%Temp%\ResultLieven.txt"
ECHO Hints during build >> "%Temp%\ResultLieven.txt"
TYPE "%Temp%\BuildLieven.txt" | FIND /c "Hint:" >> "%Temp%\ResultLieven.txt"
ECHO Failures during test >> "%Temp%\ResultLieven.txt"
TYPE "%Temp%\TestRunLieven.txt" | FIND /c "Failures:" >> "%Temp%\ResultLieven.txt"
ECHO. >> "%Temp%\ResultLieven.txt"
ECHO ***************************************************************** >> "%Temp%\ResultLieven.txt"
ECHO Controle #Projecten = #Compiles >> "%Temp%\ResultLieven.txt"
ECHO ***************************************************************** >> "%Temp%\ResultLieven.txt"
ECHO #Projecten >> "%Temp%\ResultLieven.txt"
TYPE "%Drive%\buildserver\buildserverrun.cmd" | FIND /i "cmd >> " | FIND /i "Lieven" | FIND /i /v /c "FIND /i /v /c" >> "%Temp%\ResultLieven.txt"
ECHO #Compiles >> "%Temp%\ResultLieven.txt"
TYPE "%Temp%\buildLieven.txt" | FIND /i /c "dcc32" >> "%Temp%\ResultLieven.txt"
ECHO #Tests expected to run >> "%Temp%\ResultLieven.txt"
TYPE "%Drive%\buildserver\buildserverrun.cmd" | FIND /i "TestRunLieven" | FIND /i "CALL" | FIND /i /v /c "FIND /i /v /c" >> "%Temp%\ResultLieven.txt"
ECHO #Tests actually run >> "%Temp%\ResultLieven.txt"
TYPE "%Temp%\TestRunLieven.txt" | FIND /i /c "DUnit / Testing" >> "%Temp%\ResultLieven.txt"
ECHO. >> "%Temp%\ResultLieven.txt"
ECHO. >> "%Temp%\ResultLieven.txt"
ECHO ***************************************************************** >> "%Temp%\ResultLieven.txt"
ECHO Detail (Fatal)Errors/Hints/Warnings en Failures >> "%Temp%\ResultLieven.txt"
ECHO ***************************************************************** >> "%Temp%\ResultLieven.txt"
TYPE "%Temp%\BuildLieven.txt" | FIND "Fatal:" >> "%Temp%\ResultLieven.txt"
TYPE "%Temp%\BuildLieven.txt" | FIND "Error:" >> "%Temp%\ResultLieven.txt"
TYPE "%Temp%\BuildLieven.txt" | FIND "Warning:" >> "%Temp%\ResultLieven.txt"
TYPE "%Temp%\BuildLieven.txt" | FIND "Hint:" >> "%Temp%\ResultLieven.txt"
TYPE "%Temp%\TestRunLieven.txt" | FIND "Failures:" >> "%Temp%\ResultLieven.txt"
REM *************************************************
REM Set stop time
REM *************************************************
ECHO | TIME | FIND "Huidige tijd" >> "%Temp%\ResultLieven.txt"
REM *************************************************
REM Send results
REM *************************************************
CALL %drive%\buildserver\Blat.cmd
Мой ответ более общий, чем ответ Ливена, который специфичен для Delphi. Я написал это вскоре после вопроса, но перед отправкой отправился к коллеге;)
Я отказываюсь устанавливать любую IDE на наш основной агент сборки Windows. Для меня это похоже на кошмар. Механизм MSBuild хорошо справляется со всеми сценариями сборки, и кроме .NET, вам просто нужно установить Windows SDK. Или вы можете использовать NAnt и даже CMake, что угодно. Просто не устанавливайте IDE. Это не весело на серверах сборки.
Теперь вы отметили это как Delphi. Не знаю, насколько хорошо это там работает, но, как писал Ливен, Delphi поставляется с компилятором командной строки. У меня просто нет опыта, как это работает со сторонними компонентами, но я думаю, что Delphi поддерживает MSBuild в последней версии.
I ' m также не уверен, является ли включение компонентов сторонних производителей в систему управления версиями хорошей вещью из-за занимаемого места - хотя вы также можете разместить их в другом месте и включить как внешние, что делает его намного меньше, но также создает проблему, заключающуюся в том, что обновление компонентов для одного приложения обновит их для всех, так что вам лучше провести хорошие интеграционные тесты. Но в любом случае это суть сервера сборки.
Кроме того, всегда полезно проверить и получить все компоненты, необходимые для сборки приложения. Вам не нужно устанавливать компоненты в IDE, если они были сделаны правильно. В зависимости от того, какие это компоненты, во многих случаях вам даже не нужно устанавливать их на машины разработчика. Например, многие компоненты .NET доступны в конструкторе, когда вы добавляете на них ссылку. И лицензирование, как правило, не более чем «поместить файл лицензии в тот же каталог». Ну, по крайней мере, так должно быть. Если это не то, как это работает сегодня в Delphi, вероятно, это одна из причин, по которой Delphi закрывается. Кроме проблем с Borland / Inprise / DevCo / Codegear / Embarcadero.
Здесь похожая ситуация, к счастью, она не началась с большого беспорядка. Это правда, что настоящая проблема заключается в конфигурации IDE, которая должна указывать на правильные версии сторонних компонентов, если вы проверяете старую версию. Единственное решение, о котором я слышал, - это использование разных ветвей реестра для различных конфигураций выпуска продукта.
Компоненты хранятся в отдельной структуре каталогов и по возможности используют номера версий в именах каталогов. Это упрощает проверку старых версий и позволяет сценариям сборки указывать на правильную версию.
Мы уже много лет используем Apache Ant в качестве основного инструмента сборки, и он действительно делает все, что нам нужно, включая вызов модульного теста и сценарий Innosetup поколение.