相关疑难解决方法(0)

Gradle:使用项目类路径执行Groovy交互式shell

我有一个由几个子项目组成的Gradle项目.我刚刚创建了一个新的,以添加对我想要运行的交互式Groovy shell的支持:

gradle console
Run Code Online (Sandbox Code Playgroud)

要么

gradle console:run
Run Code Online (Sandbox Code Playgroud)

所以我的新console模块的build.gradle文件如下:

apply plugin: 'groovy'
apply plugin:'application'

mainClassName = 'org.codehaus.groovy.tools.shell.Main'

dependencies {
  compile 'org.codehaus.groovy:groovy-all:2.2.2'
  compile 'org.fusesource.jansi:jansi:1.11'
  compile 'commons-cli:commons-cli:1.2'
  compile 'jline:jline:2.11'
  compile project(':my-module')
}

task(console, dependsOn: 'classes', type: JavaExec) {
  main = 'org.codehaus.groovy.tools.shell.Main'
  classpath = sourceSets.main.runtimeClasspath
}
Run Code Online (Sandbox Code Playgroud)

但是,当我跑步gradle :console:run或者gradle console得到类似的东西时:

:console:run
Groovy Shell (2.2.2, JVM: 1.6.0_45)
Type 'help' or '\h' for help.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
groovy:000> 
BUILD SUCCESSFUL

Total time: 4.529 secs
giovanni@mylaptop:~/Projects/my-project$
Run Code Online (Sandbox Code Playgroud)

因此,交互式shell似乎已经开始,但它会立即退出.

难道我做错了什么?

编辑:在build.gradle文件中添加以下内容:

run.standardInput = System.in
Run Code Online (Sandbox Code Playgroud)

现在,从输入流中读取标准输入(由于注释). …

java shell groovy gradle

9
推荐指数
1
解决办法
6041
查看次数

从Runtime.getRuntime().exec()启动wkhtmltopdf:永远不会终止?

我是从我的Java应用程序内启动wkhtmltopdf(Tomcat服务器的一部分,Win7上64位的Eclipse赫利俄斯内调试模式下运行):我想等待它完成,然后做更多的东西.

String cmd[] = {"wkhtmltopdf", htmlPathIn, pdfPathOut};
Process proc = Runtime.getRuntime().exec( cmd, null );

proc.waitFor();
Run Code Online (Sandbox Code Playgroud)

waitFor()永远不会回来.我仍然可以在Windows任务管理器中看到该过程(我将命令行传递给exec():看起来很好).它的工作原理.wkhtmltopdf生成我期望的PDF,就在我期望的地方.我可以打开它,重命名它,无论如何,即使在进程仍在运行时(在我手动终止它之前).

从命令行,一切都很好:

c:\wrk>wkhtmltopdf C:\Temp\foo.html c:\wrk\foo.pdf
Loading pages (1/6)
Counting pages (2/6)
Resolving links (4/6)
Loading headers and footers (5/6)
Printing pages (6/6)
Done

这个过程很好,生活还在继续.

那么是什么runtime.exec()导致wkhtmltopdf永不终止?

我可以抓住proc.getInputStream()并寻找"Done",但那是......卑鄙的.我想要更通用的东西.

我使用和不使用工作目录调用exec().我尝试过使用和不使用空的"env"数组.没有快乐.

为什么我的流程悬而未决,我该怎么做才能修复它?

PS:我用其他几个命令行应用程序试过这个,它们都表现出相同的行为.

进一步的执行困境.

我正在尝试阅读标准输出和错误,但没有成功.在命令行中,我知道应该是什么非常像我的命令行的经验,但是当我阅读proc.getInputStream返回的输入流(),我立即得到一个EOL(-1,我使用inputStream.read()).

我检查了JavaDoc for Process,并找到了这个

父进程使用这些流向子进程提供输入并从子进程获取输出.由于某些本机平台仅提供用于标准输入和输出流有限缓冲区的大小,没有及时写输入流或读出的子过程的输出流可导致并[b]子阻塞,甚至死锁[/ B].

强调补充说.所以我试过了.标准输出inputStream上的第一个'read()'被阻塞,直到我杀死进程...

与WKHTMLTOPDF

使用通用命令行ap&no params所以它应该"转储使用并终止",它会删除相应的std :: out,然后终止.

有趣!

JVM版本问题?我正在使用1.6.0_23.最新的是... v24.我刚检查了更改日志,看不到任何有希望的东西,但无论如何我都会尝试更新.


好的.不要让输入流填充或阻止它们.校验. .close()也可以防止这种情况,但不是非常明亮.

这通常有效(包括我测试过的通用命令行应用程序).

但具体而言,它会倒下.似乎wkhtmltopdf正在使用一些终端操作/光标内容来执行ASCII图形进度条.我相信这会导致inputStream立即返回EOF,而不是给我正确的值.

有任何想法吗?几乎不是一个交易破坏者,但它绝对是不错的.

java process runtime.exec wkhtmltopdf

8
推荐指数
1
解决办法
6234
查看次数

如何将Process的输入/输出流复制到系统对应的流程?

这是对这个问题的跟进.答案表明存在

将Process out,err和输入流复制到System版本

IOUtils.copy如下(后定影各种编译错误):

import org.apache.commons.io.IOUtils;
import java.io.IOException;

public class Test {
    public static void main(String[] args)
            throws IOException, InterruptedException {
        final Process process = Runtime.getRuntime().exec("/bin/sh -i");
        new Thread(new Runnable() {public void run() {
            try {
                IOUtils.copy(process.getInputStream(), System.out);
            } catch (IOException e) {}
        } } ).start();
        new Thread(new Runnable() {public void run() {
            try {
                IOUtils.copy(process.getErrorStream(), System.err);
            } catch (IOException e) {}
        } } ).start();
        new Thread(new Runnable() {public void run() {
            try {
                IOUtils.copy(System.in, process.getOutputStream()); …
Run Code Online (Sandbox Code Playgroud)

java io pipe process stream

7
推荐指数
1
解决办法
8755
查看次数

标签 统计

java ×3

process ×2

gradle ×1

groovy ×1

io ×1

pipe ×1

runtime.exec ×1

shell ×1

stream ×1

wkhtmltopdf ×1