Soru Maven exec eklentisini kullanarak bir windows batch betiğinin başlatılması, betiğin “start” kullanmasına rağmen yapıyı engeller.


Uygulamamın dağıtımının özel bir kapsayıcının üstüne entegre edilmesini denemeye çalışıyorum. Kapsayım özel olduğu için, kabı kurmak için Maven Cargo eklentisini kullanamıyorum.

Kapsayıcım:

  • Testlerin yapıldığı makinenin yolunda olan uygun bir yarasa dosyası olsa da başlatılmalıdır.
  • Tüm entegrasyon testlerini içeren tek bir maven modülüne sahip olduğumdan, manuel olarak kapatılabilir, bir gün bile testlerim tamamlandıktan sonra süreci nasıl kapatacağımı bilmek isterim.

Benim problemim, konteyneri farklı bir süreçte çalıştırmam gerektiğidir, çünkü testlerim yapılırken çalışmaya devam etmesi gerekiyor. Dahası, testlerimde bir kapsayıcı var ve bu da konteynerin hazır olmasını bekleyeceğim (zaman aşımıyla bir çeşit arama).

Pom.xml'e şu satırları ekledim

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.1</version>
            <executions>
                <execution>
                    <phase>pre-integration-test</phase>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <executable>scripts/start-agent.bat</executable>
            </configuration>
        </plugin>

Bu sadece içeren bir komut dosyasını çağıracaktır.

çağrıya başla gs-agent.bat

Ancak, mvn exec eklentisi tıkanmış ve testlerim çalışmıyor. Önerildiği göre Java Uygulamamdan bir toplu iş dosyasını nasıl çalıştırırım? , Benim pom.xml'imi aşağıdaki gibi değiştirdim:

 <configuration>
                <executable>cmd</executable>
                <arguments>
                    <argument>/C</argument>
                    <argument>start</argument>
                    <argument>gs-agent.bat</argument>
                </arguments>
            </configuration>

Ancak bu sorunu çözmek için görünmüyor:

Maven halted


18
2017-09-26 08:47


Menşei


Bunu kolayca ürettim. - noahlz
maven'in bloke olduğunu görebiliyor musunuz? - Edmondo1984


Cevaplar:


Bu soruya bakın: Java Uygulamamdan bir toplu iş dosyasını nasıl çalıştırırım?

Windows Batch Dosyaları yürütülebilir değildir. Onlar tarafından çalıştırılan betikler cmd yürütülebilir.

Daha fazla bilgi

Exec eklentisi kaynak kodu bunu ortaya çıkarır Apache Commons Executor aslında komut satırını yürütmek için kullanılır.

Burada yapabileceğiniz bir çok okuma var, yani Apache Commons Executor belgelerinde ve JIRA sorunlarıAncak kısa versiyonu: "Maven" ile ilgili bir sorun değil, platformun bağımlılığı ile ilgili bir problem. exec() Komut.

Bu tür bir problemi daha önce ele aldım ve her zaman tasarladığım çözüm, .bat komutlarını gerçek komutlarına yazıp doğrudan exec komut dosyasını çağırmak yerine eklenti.


6
2017-09-26 13:51



Bununla birlikte, bu sorunu çözmüyor gibi görünüyor. Üst kısımda görebildiğim gibi pom.xml'imi değiştirdim - Edmondo1984
Lütfen sorunuzu ne denediğiniz ile güncelleyin. - noahlz
maven exec eklentisi, bu durumda varsayılan olarak cmd / c'yi kullanır. - eis
benim senaryolarım çok karmaşık. En az 200 satır daha kolay bir çözüm var mı? - Edmondo1984
@Eis tarafından önerilen antrun / çatal çözümüyle giderdim. İyi şanslar. - noahlz


exec eklentisi bunu yapamaz ve ben de bunun için sorunu buldum: http://jira.codehaus.org/browse/MEXEC-87

Yukarıda bağlantılı olan jira konusunda, işlevselliğe sahip olan exec eklentisi için bir çatal ve bir çatal bağlantısı vardır.

Bunun dışında, şimdilik bir antrun-plugin kullanmanız gerektiğini düşünüyorum.

İşte çalışma konfigürasyonundan alınmış bir örnek ve mvn verify. Bunun içinde olması gerekiyor <plugins>, değil <pluginManagement> (exec sadece pluginmanagement içinde bulunabilir).

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-antrun-plugin</artifactId>
    <version>1.6</version>
    <executions>
        <execution>
            <phase>pre-integration-test</phase>
            <configuration>
                <target>
                    <exec executable="cmd.exe"
                          spawn="true">
                        <arg value="/c"/>
                        <arg value="D:\myfolder\test.bat"/>
                    </exec>
                </target>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
       </execution>
   </executions>      
</plugin>

Bunu not et spawn="true" Sorunun, sorgunun içinde belirtildiği gibi engellenmesini istemiyorsanız anahtardır. Çıktının hemen engellenmesini ve görmesini istiyorsanız, bunu yanlış olarak ayarlayın.


17
2017-09-26 15:11



Her zaman söylediğim gibi: yapı ihtiyaçlarınızın% 80'i için Maven. Her şey için Maven Antrun Plugin. :) - noahlz
maven doğrulaması ile, aşağıdaki hedefle boş yürütme yapıyorum <exec çalıştırılabilir = "cmd" spawn = "true"> <arg value = "/ c" /> <arg value = "gs-agent.bat" /> < / exec> - Edmondo1984
@ Edmondo1984 çalışan bir komut dosyasından doğrudan kopyala-yapıştır ekledi, benim için mvn ile doğru şekilde çalışıyor. Pluginmanagement'da değil eklentilerinde var mı? - eis
Diğer toplu komut dosyalarını çağıran uzun süren bir betikiniz var mı? Benim durumumda sadece spawn = true olmadan çalışır, ancak süreç eşzamanlı olarak çağrılır - Edmondo1984
evet, spawn parametresi bunu asenkronize etmek için var. Peki spawn = gerçek ne olur? - eis


Benim durumumda npm ve ng ile sorun yaşadım. exec-maven-plugin sh komut dosyalarını (uzantıları olmayan) yürütmeye çalışıyordu.

Yeniden adlandırma

C:\Users\User\AppData\Roaming\npm\ng için C:\Users\User\AppData\Roaming\npm\ng.sh

ve

C:\apps\nodejs\npm için C:\apps\nodejs\npm.sh

sorunu çözdü.


1
2018-02-03 04:45





Exec maven eklentisine göre belgeleme:

exec:exec execute programs and Java programs in a separate process.
exec:java execute Java programs in the same VM.

Exec hakkında eksiksiz belgeleri okuyun: exec İşte


1
2017-09-26 09:29



Exec çalıştırıyorum: exec, exec: java ... ama hiç de doğru görünmüyor. Doğrudan gs-agent.bat betiğini çalıştırdığımda maven de engellenir - Edmondo1984
Gs-agent.bat'ı arka planda çalıştırabilir misin? - Anshu
CMD'mde gs-agent.bat'ı başlatabilirim ve yeni bir komut isteminde başlıyor - Edmondo1984
Buradaki problem, hangi süreçte yürütüldüğü değil, maven'in testleri yürütmek için sürecin sonlandırılmasını beklemesi. - Edmondo1984
Çözümü henüz bulabildiniz mi? - Anshu


Fallow Kodu benim için çalışıyor

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.3</version>
        <executions>
            <execution>
              <phase>generate-sources</phase>
                <configuration>
                    <tasks>
                        <exec dir="${project.basedir}" executable="Script.bat"  failonerror="true">
                        </exec>
                    </tasks>
                </configuration>
                <goals>
                    <goal>run</goal>
                </goals>
       </execution>
   </executions>      
</plugin>

Kaynak https://maven.apache.org/guides/mini/guide-using-ant.html


0
2018-02-01 14:14