mirror of
https://github.com/QwenLM/qwen-code.git
synced 2026-01-14 21:09:14 +00:00
Compare commits
4 Commits
qwencode-s
...
doc/qwenco
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ad3086f7dd | ||
|
|
8f3bbef575 | ||
|
|
c6ae0a8be7 | ||
|
|
d1a3e828b7 |
@@ -11,6 +11,7 @@ export default {
|
|||||||
type: 'separator',
|
type: 'separator',
|
||||||
},
|
},
|
||||||
'sdk-typescript': 'Typescript SDK',
|
'sdk-typescript': 'Typescript SDK',
|
||||||
|
'sdk-java': 'Java SDK(alpha)',
|
||||||
'Dive Into Qwen Code': {
|
'Dive Into Qwen Code': {
|
||||||
title: 'Dive Into Qwen Code',
|
title: 'Dive Into Qwen Code',
|
||||||
type: 'separator',
|
type: 'separator',
|
||||||
|
|||||||
312
docs/developers/sdk-java.md
Normal file
312
docs/developers/sdk-java.md
Normal file
@@ -0,0 +1,312 @@
|
|||||||
|
# Qwen Code Java SDK
|
||||||
|
|
||||||
|
The Qwen Code Java SDK is a minimum experimental SDK for programmatic access to Qwen Code functionality. It provides a Java interface to interact with the Qwen Code CLI, allowing developers to integrate Qwen Code capabilities into their Java applications.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- Java >= 1.8
|
||||||
|
- Maven >= 3.6.0 (for building from source)
|
||||||
|
- qwen-code >= 0.5.0
|
||||||
|
|
||||||
|
### Dependencies
|
||||||
|
|
||||||
|
- **Logging**: ch.qos.logback:logback-classic
|
||||||
|
- **Utilities**: org.apache.commons:commons-lang3
|
||||||
|
- **JSON Processing**: com.alibaba.fastjson2:fastjson2
|
||||||
|
- **Testing**: JUnit 5 (org.junit.jupiter:junit-jupiter)
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Add the following dependency to your Maven `pom.xml`:
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba</groupId>
|
||||||
|
<artifactId>qwencode-sdk</artifactId>
|
||||||
|
<version>{$version}</version>
|
||||||
|
</dependency>
|
||||||
|
```
|
||||||
|
|
||||||
|
Or if using Gradle, add to your `build.gradle`:
|
||||||
|
|
||||||
|
```gradle
|
||||||
|
implementation 'com.alibaba:qwencode-sdk:{$version}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Building and Running
|
||||||
|
|
||||||
|
### Build Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Compile the project
|
||||||
|
mvn compile
|
||||||
|
|
||||||
|
# Run tests
|
||||||
|
mvn test
|
||||||
|
|
||||||
|
# Package the JAR
|
||||||
|
mvn package
|
||||||
|
|
||||||
|
# Install to local repository
|
||||||
|
mvn install
|
||||||
|
```
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
The simplest way to use the SDK is through the `QwenCodeCli.simpleQuery()` method:
|
||||||
|
|
||||||
|
```java
|
||||||
|
public static void runSimpleExample() {
|
||||||
|
List<String> result = QwenCodeCli.simpleQuery("hello world");
|
||||||
|
result.forEach(logger::info);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
For more advanced usage with custom transport options:
|
||||||
|
|
||||||
|
```java
|
||||||
|
public static void runTransportOptionsExample() {
|
||||||
|
TransportOptions options = new TransportOptions()
|
||||||
|
.setModel("qwen3-coder-flash")
|
||||||
|
.setPermissionMode(PermissionMode.AUTO_EDIT)
|
||||||
|
.setCwd("./")
|
||||||
|
.setEnv(new HashMap<String, String>() {{put("CUSTOM_VAR", "value");}})
|
||||||
|
.setIncludePartialMessages(true)
|
||||||
|
.setTurnTimeout(new Timeout(120L, TimeUnit.SECONDS))
|
||||||
|
.setMessageTimeout(new Timeout(90L, TimeUnit.SECONDS))
|
||||||
|
.setAllowedTools(Arrays.asList("read_file", "write_file", "list_directory"));
|
||||||
|
|
||||||
|
List<String> result = QwenCodeCli.simpleQuery("who are you, what are your capabilities?", options);
|
||||||
|
result.forEach(logger::info);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
For streaming content handling with custom content consumers:
|
||||||
|
|
||||||
|
```java
|
||||||
|
public static void runStreamingExample() {
|
||||||
|
QwenCodeCli.simpleQuery("who are you, what are your capabilities?",
|
||||||
|
new TransportOptions().setMessageTimeout(new Timeout(10L, TimeUnit.SECONDS)), new AssistantContentSimpleConsumers() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onText(Session session, TextAssistantContent textAssistantContent) {
|
||||||
|
logger.info("Text content received: {}", textAssistantContent.getText());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onThinking(Session session, ThingkingAssistantContent thingkingAssistantContent) {
|
||||||
|
logger.info("Thinking content received: {}", thingkingAssistantContent.getThinking());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onToolUse(Session session, ToolUseAssistantContent toolUseContent) {
|
||||||
|
logger.info("Tool use content received: {} with arguments: {}",
|
||||||
|
toolUseContent, toolUseContent.getInput());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onToolResult(Session session, ToolResultAssistantContent toolResultContent) {
|
||||||
|
logger.info("Tool result content received: {}", toolResultContent.getContent());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onOtherContent(Session session, AssistantContent<?> other) {
|
||||||
|
logger.info("Other content received: {}", other);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onUsage(Session session, AssistantUsage assistantUsage) {
|
||||||
|
logger.info("Usage information received: Input tokens: {}, Output tokens: {}",
|
||||||
|
assistantUsage.getUsage().getInputTokens(), assistantUsage.getUsage().getOutputTokens());
|
||||||
|
}
|
||||||
|
}.setDefaultPermissionOperation(Operation.allow));
|
||||||
|
logger.info("Streaming example completed.");
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
other examples see src/test/java/com/alibaba/qwen/code/cli/example
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
The SDK follows a layered architecture:
|
||||||
|
|
||||||
|
- **API Layer**: Provides the main entry points through `QwenCodeCli` class with simple static methods for basic usage
|
||||||
|
- **Session Layer**: Manages communication sessions with the Qwen Code CLI through the `Session` class
|
||||||
|
- **Transport Layer**: Handles the communication mechanism between the SDK and CLI process (currently using process transport via `ProcessTransport`)
|
||||||
|
- **Protocol Layer**: Defines data structures for communication based on the CLI protocol
|
||||||
|
- **Utils**: Common utilities for concurrent execution, timeout handling, and error management
|
||||||
|
|
||||||
|
## Key Features
|
||||||
|
|
||||||
|
### Permission Modes
|
||||||
|
|
||||||
|
The SDK supports different permission modes for controlling tool execution:
|
||||||
|
|
||||||
|
- **`default`**: Write tools are denied unless approved via `canUseTool` callback or in `allowedTools`. Read-only tools execute without confirmation.
|
||||||
|
- **`plan`**: Blocks all write tools, instructing AI to present a plan first.
|
||||||
|
- **`auto-edit`**: Auto-approve edit tools (edit, write_file) while other tools require confirmation.
|
||||||
|
- **`yolo`**: All tools execute automatically without confirmation.
|
||||||
|
|
||||||
|
### Session Event Consumers and Assistant Content Consumers
|
||||||
|
|
||||||
|
The SDK provides two key interfaces for handling events and content from the CLI:
|
||||||
|
|
||||||
|
#### SessionEventConsumers Interface
|
||||||
|
|
||||||
|
The `SessionEventConsumers` interface provides callbacks for different types of messages during a session:
|
||||||
|
|
||||||
|
- `onSystemMessage`: Handles system messages from the CLI (receives Session and SDKSystemMessage)
|
||||||
|
- `onResultMessage`: Handles result messages from the CLI (receives Session and SDKResultMessage)
|
||||||
|
- `onAssistantMessage`: Handles assistant messages (AI responses) (receives Session and SDKAssistantMessage)
|
||||||
|
- `onPartialAssistantMessage`: Handles partial assistant messages during streaming (receives Session and SDKPartialAssistantMessage)
|
||||||
|
- `onUserMessage`: Handles user messages (receives Session and SDKUserMessage)
|
||||||
|
- `onOtherMessage`: Handles other types of messages (receives Session and String message)
|
||||||
|
- `onControlResponse`: Handles control responses (receives Session and CLIControlResponse)
|
||||||
|
- `onControlRequest`: Handles control requests (receives Session and CLIControlRequest, returns CLIControlResponse)
|
||||||
|
- `onPermissionRequest`: Handles permission requests (receives Session and CLIControlRequest<CLIControlPermissionRequest>, returns Behavior)
|
||||||
|
|
||||||
|
#### AssistantContentConsumers Interface
|
||||||
|
|
||||||
|
The `AssistantContentConsumers` interface handles different types of content within assistant messages:
|
||||||
|
|
||||||
|
- `onText`: Handles text content (receives Session and TextAssistantContent)
|
||||||
|
- `onThinking`: Handles thinking content (receives Session and ThingkingAssistantContent)
|
||||||
|
- `onToolUse`: Handles tool use content (receives Session and ToolUseAssistantContent)
|
||||||
|
- `onToolResult`: Handles tool result content (receives Session and ToolResultAssistantContent)
|
||||||
|
- `onOtherContent`: Handles other content types (receives Session and AssistantContent)
|
||||||
|
- `onUsage`: Handles usage information (receives Session and AssistantUsage)
|
||||||
|
- `onPermissionRequest`: Handles permission requests (receives Session and CLIControlPermissionRequest, returns Behavior)
|
||||||
|
- `onOtherControlRequest`: Handles other control requests (receives Session and ControlRequestPayload, returns ControlResponsePayload)
|
||||||
|
|
||||||
|
#### Relationship Between the Interfaces
|
||||||
|
|
||||||
|
**Important Note on Event Hierarchy:**
|
||||||
|
|
||||||
|
- `SessionEventConsumers` is the **high-level** event processor that handles different message types (system, assistant, user, etc.)
|
||||||
|
- `AssistantContentConsumers` is the **low-level** content processor that handles different types of content within assistant messages (text, tools, thinking, etc.)
|
||||||
|
|
||||||
|
**Processor Relationship:**
|
||||||
|
|
||||||
|
- `SessionEventConsumers` → `AssistantContentConsumers` (SessionEventConsumers uses AssistantContentConsumers to process content within assistant messages)
|
||||||
|
|
||||||
|
**Event Derivation Relationships:**
|
||||||
|
|
||||||
|
- `onAssistantMessage` → `onText`, `onThinking`, `onToolUse`, `onToolResult`, `onOtherContent`, `onUsage`
|
||||||
|
- `onPartialAssistantMessage` → `onText`, `onThinking`, `onToolUse`, `onToolResult`, `onOtherContent`
|
||||||
|
- `onControlRequest` → `onPermissionRequest`, `onOtherControlRequest`
|
||||||
|
|
||||||
|
**Event Timeout Relationships:**
|
||||||
|
|
||||||
|
Each event handler method has a corresponding timeout method that allows customizing the timeout behavior for that specific event:
|
||||||
|
|
||||||
|
- `onSystemMessage` ↔ `onSystemMessageTimeout`
|
||||||
|
- `onResultMessage` ↔ `onResultMessageTimeout`
|
||||||
|
- `onAssistantMessage` ↔ `onAssistantMessageTimeout`
|
||||||
|
- `onPartialAssistantMessage` ↔ `onPartialAssistantMessageTimeout`
|
||||||
|
- `onUserMessage` ↔ `onUserMessageTimeout`
|
||||||
|
- `onOtherMessage` ↔ `onOtherMessageTimeout`
|
||||||
|
- `onControlResponse` ↔ `onControlResponseTimeout`
|
||||||
|
- `onControlRequest` ↔ `onControlRequestTimeout`
|
||||||
|
|
||||||
|
For AssistantContentConsumers timeout methods:
|
||||||
|
|
||||||
|
- `onText` ↔ `onTextTimeout`
|
||||||
|
- `onThinking` ↔ `onThinkingTimeout`
|
||||||
|
- `onToolUse` ↔ `onToolUseTimeout`
|
||||||
|
- `onToolResult` ↔ `onToolResultTimeout`
|
||||||
|
- `onOtherContent` ↔ `onOtherContentTimeout`
|
||||||
|
- `onPermissionRequest` ↔ `onPermissionRequestTimeout`
|
||||||
|
- `onOtherControlRequest` ↔ `onOtherControlRequestTimeout`
|
||||||
|
|
||||||
|
**Default Timeout Values:**
|
||||||
|
|
||||||
|
- `SessionEventSimpleConsumers` default timeout: 180 seconds (Timeout.TIMEOUT_180_SECONDS)
|
||||||
|
- `AssistantContentSimpleConsumers` default timeout: 60 seconds (Timeout.TIMEOUT_60_SECONDS)
|
||||||
|
|
||||||
|
**Timeout Hierarchy Requirements:**
|
||||||
|
|
||||||
|
For proper operation, the following timeout relationships should be maintained:
|
||||||
|
|
||||||
|
- `onAssistantMessageTimeout` return value should be greater than `onTextTimeout`, `onThinkingTimeout`, `onToolUseTimeout`, `onToolResultTimeout`, and `onOtherContentTimeout` return values
|
||||||
|
- `onControlRequestTimeout` return value should be greater than `onPermissionRequestTimeout` and `onOtherControlRequestTimeout` return values
|
||||||
|
|
||||||
|
### Transport Options
|
||||||
|
|
||||||
|
The `TransportOptions` class allows configuration of how the SDK communicates with the Qwen Code CLI:
|
||||||
|
|
||||||
|
- `pathToQwenExecutable`: Path to the Qwen Code CLI executable
|
||||||
|
- `cwd`: Working directory for the CLI process
|
||||||
|
- `model`: AI model to use for the session
|
||||||
|
- `permissionMode`: Permission mode that controls tool execution
|
||||||
|
- `env`: Environment variables to pass to the CLI process
|
||||||
|
- `maxSessionTurns`: Limits the number of conversation turns in a session
|
||||||
|
- `coreTools`: List of core tools that should be available to the AI
|
||||||
|
- `excludeTools`: List of tools to exclude from being available to the AI
|
||||||
|
- `allowedTools`: List of tools that are pre-approved for use without additional confirmation
|
||||||
|
- `authType`: Authentication type to use for the session
|
||||||
|
- `includePartialMessages`: Enables receiving partial messages during streaming responses
|
||||||
|
- `skillsEnable`: Enables or disables skills functionality for the session
|
||||||
|
- `turnTimeout`: Timeout for a complete turn of conversation
|
||||||
|
- `messageTimeout`: Timeout for individual messages within a turn
|
||||||
|
- `resumeSessionId`: ID of a previous session to resume
|
||||||
|
- `otherOptions`: Additional command-line options to pass to the CLI
|
||||||
|
|
||||||
|
### Session Control Features
|
||||||
|
|
||||||
|
- **Session creation**: Use `QwenCodeCli.newSession()` to create a new session with custom options
|
||||||
|
- **Session management**: The `Session` class provides methods to send prompts, handle responses, and manage session state
|
||||||
|
- **Session cleanup**: Always close sessions using `session.close()` to properly terminate the CLI process
|
||||||
|
- **Session resumption**: Use `setResumeSessionId()` in `TransportOptions` to resume a previous session
|
||||||
|
- **Session interruption**: Use `session.interrupt()` to interrupt a currently running prompt
|
||||||
|
- **Dynamic model switching**: Use `session.setModel()` to change the model during a session
|
||||||
|
- **Dynamic permission mode switching**: Use `session.setPermissionMode()` to change the permission mode during a session
|
||||||
|
|
||||||
|
### Thread Pool Configuration
|
||||||
|
|
||||||
|
The SDK uses a thread pool for managing concurrent operations with the following default configuration:
|
||||||
|
|
||||||
|
- **Core Pool Size**: 30 threads
|
||||||
|
- **Maximum Pool Size**: 100 threads
|
||||||
|
- **Keep-Alive Time**: 60 seconds
|
||||||
|
- **Queue Capacity**: 300 tasks (using LinkedBlockingQueue)
|
||||||
|
- **Thread Naming**: "qwen_code_cli-pool-{number}"
|
||||||
|
- **Daemon Threads**: false
|
||||||
|
- **Rejected Execution Handler**: CallerRunsPolicy
|
||||||
|
|
||||||
|
## Error Handling
|
||||||
|
|
||||||
|
The SDK provides specific exception types for different error scenarios:
|
||||||
|
|
||||||
|
- `SessionControlException`: Thrown when there's an issue with session control (creation, initialization, etc.)
|
||||||
|
- `SessionSendPromptException`: Thrown when there's an issue sending a prompt or receiving a response
|
||||||
|
- `SessionClosedException`: Thrown when attempting to use a closed session
|
||||||
|
|
||||||
|
## FAQ / Troubleshooting
|
||||||
|
|
||||||
|
### Q: Do I need to install the Qwen CLI separately?
|
||||||
|
|
||||||
|
A: yes, requires Qwen CLI 0.5.5 or higher.
|
||||||
|
|
||||||
|
### Q: What Java versions are supported?
|
||||||
|
|
||||||
|
A: The SDK requires Java 1.8 or higher.
|
||||||
|
|
||||||
|
### Q: How do I handle long-running requests?
|
||||||
|
|
||||||
|
A: The SDK includes timeout utilities. You can configure timeouts using the `Timeout` class in `TransportOptions`.
|
||||||
|
|
||||||
|
### Q: Why are some tools not executing?
|
||||||
|
|
||||||
|
A: This is likely due to permission modes. Check your permission mode settings and consider using `allowedTools` to pre-approve certain tools.
|
||||||
|
|
||||||
|
### Q: How do I resume a previous session?
|
||||||
|
|
||||||
|
A: Use the `setResumeSessionId()` method in `TransportOptions` to resume a previous session.
|
||||||
|
|
||||||
|
### Q: Can I customize the environment for the CLI process?
|
||||||
|
|
||||||
|
A: Yes, use the `setEnv()` method in `TransportOptions` to pass environment variables to the CLI process.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Apache-2.0 - see [LICENSE](./LICENSE) for details.
|
||||||
201
packages/sdk-java/LICENSE
Normal file
201
packages/sdk-java/LICENSE
Normal file
@@ -0,0 +1,201 @@
|
|||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
@@ -113,7 +113,7 @@ The project uses Checkstyle for code formatting and style enforcement. The confi
|
|||||||
|
|
||||||
### Documentation
|
### Documentation
|
||||||
|
|
||||||
- API documentation should follow JavaDoc conventions
|
- API documentation should follow Javadoc conventions
|
||||||
- Update README files when adding new features
|
- Update README files when adding new features
|
||||||
- Include examples in documentation
|
- Include examples in documentation
|
||||||
|
|
||||||
|
|||||||
@@ -33,8 +33,8 @@
|
|||||||
<logback-classic.version>1.3.16</logback-classic.version>
|
<logback-classic.version>1.3.16</logback-classic.version>
|
||||||
<fastjson2.version>2.0.60</fastjson2.version>
|
<fastjson2.version>2.0.60</fastjson2.version>
|
||||||
<maven-compiler-plugin.version>3.13.0</maven-compiler-plugin.version>
|
<maven-compiler-plugin.version>3.13.0</maven-compiler-plugin.version>
|
||||||
<central-publishing-maven-plugin.version>9</central-publishing-maven-plugin.version>
|
<central-publishing-maven-plugin.version>0.8.0</central-publishing-maven-plugin.version>
|
||||||
<maven-source-plugin.version>2</maven-source-plugin.version>
|
<maven-source-plugin.version>2.2.1</maven-source-plugin.version>
|
||||||
<maven-javadoc-plugin.version>2.9.1</maven-javadoc-plugin.version>
|
<maven-javadoc-plugin.version>2.9.1</maven-javadoc-plugin.version>
|
||||||
<maven-gpg-plugin.version>1.5</maven-gpg-plugin.version>
|
<maven-gpg-plugin.version>1.5</maven-gpg-plugin.version>
|
||||||
</properties>
|
</properties>
|
||||||
@@ -112,7 +112,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.sonatype.central</groupId>
|
<groupId>org.sonatype.central</groupId>
|
||||||
<artifactId>central-publishing-maven-plugin</artifactId>
|
<artifactId>central-publishing-maven-plugin</artifactId>
|
||||||
<version>0.${central-publishing-maven-plugin.version}.0</version>
|
<version>${central-publishing-maven-plugin.version}</version>
|
||||||
<extensions>true</extensions>
|
<extensions>true</extensions>
|
||||||
<configuration>
|
<configuration>
|
||||||
<publishingServerId>central</publishingServerId>
|
<publishingServerId>central</publishingServerId>
|
||||||
@@ -122,7 +122,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-source-plugin</artifactId>
|
<artifactId>maven-source-plugin</artifactId>
|
||||||
<version>${maven-source-plugin.version}.2.1</version>
|
<version>${maven-source-plugin.version}</version>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<id>attach-sources</id>
|
<id>attach-sources</id>
|
||||||
|
|||||||
Reference in New Issue
Block a user