demo
This commit is contained in:
parent
32580b0c14
commit
cbc87213d1
|
|
@ -11,6 +11,8 @@
|
||||||
|
|
||||||
# AWS User-specific
|
# AWS User-specific
|
||||||
.idea/**/aws.xml
|
.idea/**/aws.xml
|
||||||
|
/.idea
|
||||||
|
/target
|
||||||
|
|
||||||
# Generated files
|
# Generated files
|
||||||
.idea/**/contentModel.xml
|
.idea/**/contentModel.xml
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
|
||||||
|
http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>com.example</groupId>
|
||||||
|
<artifactId>cc-process-demo</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>1.8</maven.compiler.source>
|
||||||
|
<maven.compiler.target>1.8</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<!-- 在这里添加项目依赖 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.cyclingbits</groupId>
|
||||||
|
<artifactId>claude-code-sdk-java</artifactId>
|
||||||
|
<version>1.2.0</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.8.1</version>
|
||||||
|
<configuration>
|
||||||
|
<source>1.8</source>
|
||||||
|
<target>1.8</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
||||||
|
|
@ -0,0 +1,121 @@
|
||||||
|
package com.example;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
|
||||||
|
public class CommandRunDemo {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
executeClaudeCommand(new File("D:/test"), "创建一个测试文件到这个目录");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行命令
|
||||||
|
* @param dir 执行命令的目录
|
||||||
|
* @param command 执行的命令
|
||||||
|
* @return 执行是否正常完成
|
||||||
|
*/
|
||||||
|
public static boolean executeCommand(File dir, String... command) {
|
||||||
|
try {
|
||||||
|
ProcessBuilder processBuilder = new ProcessBuilder(command);
|
||||||
|
if (!dir.exists()) {
|
||||||
|
if (!dir.mkdirs()) {
|
||||||
|
// throw new BusinessException("创建目录失败");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
processBuilder.directory(dir);
|
||||||
|
processBuilder.redirectErrorStream(true);
|
||||||
|
|
||||||
|
Process process = processBuilder.start();
|
||||||
|
|
||||||
|
StringBuilder output = new StringBuilder();
|
||||||
|
try (BufferedReader reader = new BufferedReader(
|
||||||
|
new InputStreamReader(process.getInputStream()))) {
|
||||||
|
String line;
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
output.append(line).append("\n");
|
||||||
|
System.out.println(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int exitCode = process.waitFor();
|
||||||
|
if (exitCode == 0) {
|
||||||
|
// log.info("命令执行成功:{}", String.join(" ", command));
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
// log.error("命令执行失败,退出码:{},输出:{}", exitCode, output);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
// log.error("执行G命令异常:{}", String.join(" ", command), e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 调用CC
|
||||||
|
* @param dir 访问目录
|
||||||
|
* @param prompt CC执行提示词
|
||||||
|
* @return 执行是否正常完成
|
||||||
|
*/
|
||||||
|
public static boolean executeClaudeCommand(File dir, String prompt) {
|
||||||
|
try {
|
||||||
|
// log.info("使用ClaudeCode执行提示词:{}", prompt);
|
||||||
|
|
||||||
|
ProcessBuilder processBuilder = new ProcessBuilder(
|
||||||
|
"claude", //需要保证claude在PATH中,某些npm的特殊安装方法可能不适用(如fnm安装)
|
||||||
|
"-p", prompt,
|
||||||
|
"--output-format", "stream-json",
|
||||||
|
"--dangerously-skip-permissions",
|
||||||
|
"--verbose"
|
||||||
|
);
|
||||||
|
processBuilder.directory(dir);
|
||||||
|
|
||||||
|
// processBuilder.redirectErrorStream();// 将错误流重定向到标准输出流
|
||||||
|
|
||||||
|
Process process = processBuilder.start();
|
||||||
|
|
||||||
|
// claude的bug,不手工关闭输入流的话,会卡死
|
||||||
|
if (process.getOutputStream() != null) {
|
||||||
|
process.getOutputStream().close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理输入流(脚本输出内容)
|
||||||
|
new Thread(() -> handleStream(process.getInputStream(), false)).start();
|
||||||
|
|
||||||
|
// 处理错误流(脚本错误输出)
|
||||||
|
new Thread(() -> handleStream(process.getErrorStream(), true)).start();
|
||||||
|
|
||||||
|
int exitCode = process.waitFor();
|
||||||
|
// log.info("ClaudeCode执行结束,结束码:{}", exitCode);
|
||||||
|
return exitCode == 0;
|
||||||
|
} catch (Exception e) {
|
||||||
|
// log.error("使用ClaudeCode生成修复代码失败", e);
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理流
|
||||||
|
*
|
||||||
|
* @param inputStream 输入流
|
||||||
|
* @param error 是否为错误流
|
||||||
|
*/
|
||||||
|
private static void handleStream(java.io.InputStream inputStream, boolean error) {
|
||||||
|
try (BufferedReader reader = new BufferedReader(
|
||||||
|
new InputStreamReader(inputStream, "GBK"))) { // 使用GBK编码适应Windows环境
|
||||||
|
String line;
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
if (error) {
|
||||||
|
System.err.println(line);
|
||||||
|
} else {
|
||||||
|
System.out.println(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
package com.example;
|
||||||
|
|
||||||
|
import kotlin.coroutines.Continuation;
|
||||||
|
import kotlin.coroutines.CoroutineContext;
|
||||||
|
import kotlinx.coroutines.flow.Flow;
|
||||||
|
import net.cyclingbits.claudecode.api.ClaudeCodeClient;
|
||||||
|
import net.cyclingbits.claudecode.types.*;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author lroyia
|
||||||
|
* @since 2026/1/9 20:54
|
||||||
|
**/
|
||||||
|
public class SdkRunDemo {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
ClaudeCodeClient claudeCodeClient = new ClaudeCodeClient();
|
||||||
|
ClaudeCodeOptions options = ClaudeCodeOptions.builder()
|
||||||
|
.permissionMode(PermissionMode.BYPASS_PERMISSIONS)
|
||||||
|
// .cwd()// 设置工作路径
|
||||||
|
.build();
|
||||||
|
List<Message> join = claudeCodeClient.queryAsync("在当前目录创建一个空的test.txt文件", options).join();
|
||||||
|
join.forEach(System.out::println);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue