Wenn Terminal Forks verarbeitet werden, verliert die aktuelle App den Fokus

Während ich ein Programm in Terminal (oder iTerm2) ausführe und das Programm den Prozess verzweigt, wechselt der OS X-Desktop den Fokus von der aktuellen Anwendung auf den verzweigten Prozess. In diesem Fall wird der gespaltene Prozessname in der OS X-Menüleiste angezeigt.

Dies ist besonders ärgerlich, wenn Sie den Vollbildmodus verwenden, da es dazu führt, dass sich der Arbeitsbereich ändert, wenn der gegabelte Prozess den Fokus erhält.

Wie kann ich diesen Fokuswechsel verhindern? Diese Terminalprogramme unterbrechen meine Arbeit in anderen Anwendungen, während sie ausgeführt werden.

Welche Programme rufst du vom Terminal aus auf?
Maven. Das Maven Surefire-Plug-in zum Ausführen von Java-Komponententests verwendet diese ForkedBooter -Klasse, die den Fokus immer vom Terminal weglenkt
Es ist nicht nur Maven, aber dies ist eines meiner konkreten Beispiele
Kann es sein, dass es nur bei Java-Anwendungen passiert?
Vielleicht. Wenn ich ein Gegenbeispiel finde, poste ich es
Ich kann bestätigen, dass es monoin einem ähnlichen Szenario passiert.
Es passiert auch mit IntelliJ. Wenn ich JUnit-Tests in IntelliJ ausführe, verliert die App den Fokus. Weiß jemand, ob das bei Mavericks noch vorkommt?

Antworten (3)

In meinem Fall war es das Maven Failsafe Plugin, das den lästigen Fensterfokus von ForkedBooter verursacht hat, und das Setzen der JAVA_TOOL_OPTIONSVariable .bashrchat nicht geholfen.

Dieser Fix gilt sowohl für Failsafe als auch für Surefire (obwohl Surefire in meinem Fall den Fokus nicht gestohlen hat).

Fügen Sie in Ihrer pom.xml, eine <argLine>-Djava.awt.headless=true</argLine>Zeile <configuration>für das ausfallsichere (und/oder) todsichere Plugin hinzu.

Es wird so aussehen:

<!-- this is inside your <project><build><plugins> block -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>${maven.surefire.plugin.version}</version>
    <configuration>
      <includes>
        <include>**/unit/**/*Test*.java</include>
      </includes>
      <!-- prevent the annoying ForkedBooter process from stealing window 
        focus on Mac OS -->
      <argLine>-Djava.awt.headless=true</argLine>
    </configuration>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>${maven.failsafe.plugin.version}</version>
    <configuration>
      <!-- prevent the annoying ForkedBooter process from stealing window 
        focus on Mac OS -->
      <argLine>-Djava.awt.headless=true</argLine>
      <includes>
        <include>**/integration/**/*Test*</include>
      </includes>
    </configuration>
    <executions>
      <execution>
        <goals>
          <goal>integration-test</goal>
          <goal>verify</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

Wie @patrix vorgeschlagen hat, habe ich dieses Problem anscheinend nur mit Java-Prozessen.

Diese Antwort bei StackOverflow scheint das Problem zu lösen

Können Sie Ihr Terminalprogramm im Hintergrund ausführen? Ich glaube, dies wird verhindern, dass es auch auf dem Desktop in den Fokus rückt. Fügen Sie einfach '&' am Ende des Terminalbefehls hinzu, um einen Prozess im Hintergrund auszuführen.

Also, wenn Ihr Terminalbefehl wäre:

sh irgendein Prozess.sh

ändere es zu:

sh someprocess.sh &

Um einen Hintergrundprozess im Terminal in den Vordergrund zu bringen, verwenden Sie den Befehl:

fg