Browse Source

项目初始化

main
wandong 9 months ago
commit
94ebe1cff0
  1. 50
      .gitignore
  2. 24
      .run/Run IDE with Plugin.run.xml
  3. 46
      build.gradle.kts
  4. 6
      gradle.properties
  5. BIN
      gradle/wrapper/gradle-wrapper.jar
  6. 5
      gradle/wrapper/gradle-wrapper.properties
  7. 234
      gradlew
  8. 89
      gradlew.bat
  9. 6
      path/to/LatestVersionResolver.kt
  10. 133
      readMe.md
  11. 8
      settings.gradle.kts
  12. 173
      src/main/java/com/wd/maven/aggregation/AggregationProjectDialog.java
  13. 327
      src/main/java/com/wd/maven/aggregation/AggregationProjectGenerator.java
  14. 41
      src/main/java/com/wd/maven/aggregation/DebounceDocumentListener.java
  15. 56
      src/main/java/com/wd/maven/aggregation/MavenAggregationProjectGenerator.java
  16. 54
      src/main/java/com/wd/maven/aggregation/MavenAggregationSettings.java
  17. 227
      src/main/java/com/wd/maven/aggregation/MavenAggregationSettingsPanel.java
  18. 42
      src/main/java/com/wd/maven/aggregation/QuickstartAggregationAction.java
  19. 27
      src/main/java/com/wd/maven/aggregation/SimpleDocumentListener.java
  20. 52
      src/main/resources/META-INF/plugin.xml
  21. 12
      src/main/resources/META-INF/pluginIcon.svg

50
.gitignore

@ -0,0 +1,50 @@
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/
### IntelliJ IDEA ###
.idea/
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
out/
!**/src/main/**/out/
!**/src/test/**/out/
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store
# Maven specific
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next

24
.run/Run IDE with Plugin.run.xml

@ -0,0 +1,24 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Run Plugin" type="GradleRunConfiguration" factoryName="Gradle">
<log_file alias="idea.log" path="$PROJECT_DIR$/build/idea-sandbox/system/log/idea.log"/>
<ExternalSystemSettings>
<option name="executionName"/>
<option name="externalProjectPath" value="$PROJECT_DIR$"/>
<option name="externalSystemIdString" value="GRADLE"/>
<option name="scriptParameters" value=""/>
<option name="taskDescriptions">
<list/>
</option>
<option name="taskNames">
<list>
<option value="runIde"/>
</list>
</option>
<option name="vmOptions" value=""/>
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<method v="2"/>
</configuration>
</component>

46
build.gradle.kts

@ -0,0 +1,46 @@
plugins {
id("java")
id("org.jetbrains.kotlin.jvm") version "1.9.25"
id("org.jetbrains.intellij") version "1.17.4"
}
group = "com.wd"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
// Configure Gradle IntelliJ Plugin
// Read more: https://plugins.jetbrains.com/docs/intellij/tools-gradle-intellij-plugin.html
intellij {
version.set("2024.3")
type.set("IC") // Target IDE Platform
plugins.set(listOf(/* Plugin Dependencies */))
}
tasks {
// Set the JVM compatibility versions
withType<JavaCompile> {
sourceCompatibility = "17"
targetCompatibility = "17"
}
withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
kotlinOptions.jvmTarget = "17"
}
patchPluginXml {
sinceBuild.set("231.*")
untilBuild.set("243.*")
}
signPlugin {
certificateChain.set(System.getenv("CERTIFICATE_CHAIN"))
privateKey.set(System.getenv("PRIVATE_KEY"))
password.set(System.getenv("PRIVATE_KEY_PASSWORD"))
}
publishPlugin {
token.set(System.getenv("PUBLISH_TOKEN"))
}
}

6
gradle.properties

@ -0,0 +1,6 @@
# Opt-out flag for bundling Kotlin standard library -> https://jb.gg/intellij-platform-kotlin-stdlib
kotlin.stdlib.default.dependency=false
# Enable Gradle Configuration Cache -> https://docs.gradle.org/current/userguide/configuration_cache.html
org.gradle.configuration-cache=true
# Enable Gradle Build Cache -> https://docs.gradle.org/current/userguide/build_cache.html
org.gradle.caching=true

BIN
gradle/wrapper/gradle-wrapper.jar

Binary file not shown.

5
gradle/wrapper/gradle-wrapper.properties

@ -0,0 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.11.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

234
gradlew

@ -0,0 +1,234 @@
#!/bin/sh
#
# Copyright © 2015-2021 the original authors.
#
# 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
#
# https://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.
#
##############################################################################
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
APP_BASE_NAME=${0##*/}
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
warn () {
echo "$*"
} >&2
die () {
echo
echo "$*"
echo
exit 1
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"

89
gradlew.bat

@ -0,0 +1,89 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

6
path/to/LatestVersionResolver.kt

@ -0,0 +1,6 @@
val location: String? = connection.getHeaderField("Location")
if (location == null) {
// 处理 Location 为 null 的情况,例如抛出异常或返回默认值
throw IOException("Location header is missing in the response")
}
// 原有逻辑

133
readMe.md

@ -0,0 +1,133 @@
# Maven-aggregation Quickstart
Maven-aggregation Quickstart 是一个 IntelliJ IDEA 插件,用于快速生成标准的多模块 Maven 项目结构。通过该插件,你可以一键创建模块化项目,并自动配置模块间的依赖关系,同时支持自定义模块名称和 Java 版本,非常适合用于 Java 项目的快速启动。
---
## 📌 主要功能
- **一键创建 Maven 多模块项目结构**
- **自动生成模块间的依赖关系**
- **支持自定义模块名称**
- **支持选择 Java 版本**
- **自动生成 README.md 和 .gitignore 文件**
---
## 🚀 使用方法
### 1. 安装插件
1. 打开 IntelliJ IDEA。
2. 进入 `Settings (Preferences)` > `Plugins`
3. 点击 `Marketplace` 标签。
4. 搜索 `Maven-aggregation Quickstart`
5. 点击 `Install` 安装插件。
6. 重启 IntelliJ IDEA。
### 2. 创建项目
1. 打开 IntelliJ IDEA。
2. 点击菜单 `File > New > Create Maven Aggregation Project`
3. 填写以下信息:
- GroupId: Maven 项目的组织标识(例如:`com.example`)
- ArtifactId: 项目名称
- Version: 项目版本(默认 `1.0.0`
- 模块名称:输入多个模块名称(例如:`api`, `service`, `pojo`
- Java 版本:选择项目使用的 Java 版本
4. 点击 `Finish`,插件会自动生成项目结构。
---
## 📁 项目结构示例
生成的项目目录结构如下:
your-project-name/
├── api/
├── service/
├── pojo/
├── common/
├── mapper
每个模块都包含以下标准目录结构:
module-name/
├── src/ │
├── main/ │ │
├── java/ Java 源代码
│ │ └── resources/ 静态资源文件
│ └── test/ │ ├── java/ 测试代码
---
## 🧩 模块说明
| 模块名称 | 说明 |
|---------|------|
| `api` | 对外暴露的 API 接口模块 |
| `common` | 公共工具类和通用组件模块 |
| `mapper` | 数据访问层模块(通常用于数据库操作) |
| `pojo` | 实体类模块 |
| `service` | 业务逻辑模块 |
> 注意:你可以自定义模块名称,插件会自动识别并生成对应描述。
---
## 🧪 构建项目
为了确保项目的顺利构建,请按照以下步骤操作:
1. **打开终端**:在你的项目根目录下打开一个新的终端窗口。
2. **执行 Maven 命令**:运行以下命令来清理并安装项目依赖。
```
mvn clean install
```
---
## 🛠️ 开发与构建插件
如果你希望修改插件或构建插件源码,请参考以下步骤:
### 1. 克隆仓库
```
git clone https://github.com/yourname/maven-aggregation.git
cd maven-aggregation
```
### 2. 构建插件
使用 Maven 构建插件:
```
mvn clean package
```
构建完成后,插件的 `.jar` 文件会生成在 `target/` 目录下。
### 3. 安装插件到 IntelliJ IDEA
1. 打开 IntelliJ IDEA。
2. 进入 `Settings (Preferences)` > `Plugins`
3. 点击 `Install Plugin from Disk...`
4. 选择 `target/maven-aggregation.jar`
5. 安装并重启 IntelliJ IDEA.
---
## 📞 联系我们
如果你有任何问题或建议,请联系:
📧 Email: 1938023944@qq.com
🌐 Website: [https://www.wandong.com](https://www.wandong.com)
---

8
settings.gradle.kts

@ -0,0 +1,8 @@
pluginManagement {
repositories {
mavenCentral()
gradlePluginPortal()
}
}
rootProject.name = "maven-aggregation"

173
src/main/java/com/wd/maven/aggregation/AggregationProjectDialog.java

@ -0,0 +1,173 @@
package com.wd.maven.aggregation;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.ValidationInfo;
import com.intellij.ui.components.JBCheckBox;
import com.intellij.ui.components.JBLabel;
import com.intellij.ui.components.JBTextField;
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class AggregationProjectDialog extends DialogWrapper {
private JBTextField groupIdField;
private JBTextField artifactIdField;
private JBTextField versionField;
private JBTextField modulesField;
private JComboBox<String> javaVersionComboBox;
// 预定义模块复选框
private JBCheckBox apiCheckBox;
private JBCheckBox commonCheckBox;
private JBCheckBox mapperCheckBox;
private JBCheckBox pojoCheckBox;
private JBCheckBox serviceCheckBox;
public AggregationProjectDialog(Project project) {
super(project);
setTitle("创建Maven聚合项目");
init();
}
@Override
protected JComponent createCenterPanel() {
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.insets = new Insets(5, 5, 5, 5);
// Group ID
c.gridx = 0;
c.gridy = 0;
panel.add(new JBLabel("Group ID:"), c);
c.gridx = 1;
c.weightx = 1.0;
groupIdField = new JBTextField("com.example");
panel.add(groupIdField, c);
// Artifact ID
c.gridx = 0;
c.gridy = 1;
c.weightx = 0.0;
panel.add(new JBLabel("Artifact ID:"), c);
c.gridx = 1;
c.weightx = 1.0;
artifactIdField = new JBTextField("demo");
panel.add(artifactIdField, c);
// Version
c.gridx = 0;
c.gridy = 2;
c.weightx = 0.0;
panel.add(new JBLabel("Version:"), c);
c.gridx = 1;
c.weightx = 1.0;
versionField = new JBTextField("1.0-SNAPSHOT");
panel.add(versionField, c);
// Java Version
c.gridx = 0;
c.gridy = 3;
c.weightx = 0.0;
panel.add(new JBLabel("Java Version:"), c);
c.gridx = 1;
c.weightx = 1.0;
javaVersionComboBox = new JComboBox<>(new String[]{"8", "11", "17", "21"});
panel.add(javaVersionComboBox, c);
// 预定义模块
c.gridx = 0;
c.gridy = 4;
c.weightx = 0.0;
panel.add(new JBLabel("预定义模块:"), c);
// 模块复选框面板
JPanel modulesPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
apiCheckBox = new JBCheckBox("api", true);
commonCheckBox = new JBCheckBox("common", true);
mapperCheckBox = new JBCheckBox("mapper", true);
pojoCheckBox = new JBCheckBox("pojo", true);
serviceCheckBox = new JBCheckBox("service", true);
modulesPanel.add(apiCheckBox);
modulesPanel.add(commonCheckBox);
modulesPanel.add(mapperCheckBox);
modulesPanel.add(pojoCheckBox);
modulesPanel.add(serviceCheckBox);
c.gridx = 1;
c.weightx = 1.0;
panel.add(modulesPanel, c);
// 自定义模块
c.gridx = 0;
c.gridy = 5;
c.weightx = 0.0;
panel.add(new JBLabel("自定义模块 (逗号分隔):"), c);
c.gridx = 1;
c.weightx = 1.0;
modulesField = new JBTextField();
panel.add(modulesField, c);
return panel;
}
@Override
protected ValidationInfo doValidate() {
if (groupIdField.getText().trim().isEmpty()) {
return new ValidationInfo("Group ID不能为空", groupIdField);
}
if (artifactIdField.getText().trim().isEmpty()) {
return new ValidationInfo("Artifact ID不能为空", artifactIdField);
}
if (versionField.getText().trim().isEmpty()) {
return new ValidationInfo("Version不能为空", versionField);
}
return null;
}
public String getGroupId() {
return groupIdField.getText().trim();
}
public String getArtifactId() {
return artifactIdField.getText().trim();
}
public String getVersion() {
return versionField.getText().trim();
}
public String getJavaVersion() {
return (String) javaVersionComboBox.getSelectedItem();
}
public String[] getModules() {
List<String> modulesList = new ArrayList<>();
// 添加选中的预定义模块
if (apiCheckBox.isSelected()) modulesList.add("api");
if (commonCheckBox.isSelected()) modulesList.add("common");
if (mapperCheckBox.isSelected()) modulesList.add("mapper");
if (pojoCheckBox.isSelected()) modulesList.add("pojo");
if (serviceCheckBox.isSelected()) modulesList.add("service");
// 添加自定义模块
String customModules = modulesField.getText().trim();
if (!customModules.isEmpty()) {
modulesList.addAll(Arrays.asList(customModules.split("\\s*,\\s*")));
}
return modulesList.toArray(new String[0]);
}
}

327
src/main/java/com/wd/maven/aggregation/AggregationProjectGenerator.java

@ -0,0 +1,327 @@
package com.wd.maven.aggregation;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
public class AggregationProjectGenerator {
private static final Logger LOG = Logger.getInstance(AggregationProjectGenerator.class);
public void generateProject(Project project, String groupId, String artifactId, String version, String[] modules, String javaVersion) {
VirtualFile baseDir = project.getBaseDir();
if (baseDir == null) {
LOG.warn("Project base directory not found.");
return;
}
Path projectPath = Paths.get(baseDir.getPath());
// 写入父 POM
writeParentPom(projectPath, groupId, artifactId, version, modules, javaVersion);
// 写入子模块
for (String module : modules) {
// 使用父项目名-子模块名的格式创建目录
String moduleName = artifactId + "-" + module;
Path modulePath = projectPath.resolve(moduleName);
writeModulePom(modulePath, groupId, artifactId, version, moduleName);
createDirectoryStructure(modulePath.resolve("src/main/java"));
createDirectoryStructure(modulePath.resolve("src/test/java"));
createDirectoryStructure(modulePath.resolve("src/main/resources"));
}
// 添加模块间依赖
addModuleDependencies(projectPath, groupId, version, artifactId, modules);
// README.md
writeReadme(projectPath, artifactId, modules);
// .gitignore
writeGitignore(projectPath);
}
private void writeParentPom(Path projectPath, String groupId, String artifactId, String version, String[] modules, String javaVersion) {
StringBuilder moduleXml = new StringBuilder();
for (String module : modules) {
// 使用父项目名-子模块名的格式
String moduleName = artifactId + "-" + module;
moduleXml.append(" <module>").append(moduleName).append("</module>\n");
}
StringBuilder dependencyManagementXml = new StringBuilder();
for (String module : modules) {
dependencyManagementXml.append(" <dependency>\n")
.append(" <groupId>").append(groupId).append("</groupId>\n")
.append(" <artifactId>").append(artifactId).append("-").append(module).append("</artifactId>\n") // 使用正确的 artifactId
.append(" <version>${project.version}</version>\n")
.append(" </dependency>\n");
}
String content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n" +
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n" +
" <modelVersion>4.0.0</modelVersion>\n" +
"\n" +
" <groupId>" + groupId + "</groupId>\n" +
" <artifactId>" + artifactId + "</artifactId>\n" +
" <version>" + version + "</version>\n" +
" <packaging>pom</packaging>\n" +
"\n" +
" <modules>\n" +
moduleXml.toString() +
" </modules>\n" +
"\n" +
" <properties>\n" +
" <maven.compiler.source>" + javaVersion + "</maven.compiler.source>\n" +
" <maven.compiler.target>" + javaVersion + "</maven.compiler.target>\n" +
" <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n" +
" </properties>\n" +
"\n" +
" <dependencyManagement>\n" +
" <dependencies>\n" +
" <!-- 项目内部模块依赖 -->\n" +
dependencyManagementXml.toString() +
" </dependencies>\n" +
" </dependencyManagement>\n" +
"</project>";
writeToFile(projectPath.resolve("pom.xml"), content);
}
private void writeReadme(Path projectPath, String projectName, String[] modules) {
StringBuilder modulesDescription = new StringBuilder();
for (String module : modules) {
modulesDescription.append("- `").append(module).append("`: ");
// 根据模块名称添加描述
if (module.equals("api")) {
modulesDescription.append("对外暴露的API接口模块\n");
} else if (module.equals("common")) {
modulesDescription.append("公共工具类和通用组件模块\n");
} else if (module.equals("mapper")) {
modulesDescription.append("数据访问层模块\n");
} else if (module.equals("pojo")) {
modulesDescription.append("实体类模块\n");
} else if (module.equals("service")) {
modulesDescription.append("业务逻辑模块\n");
} else {
modulesDescription.append("自定义模块\n");
}
}
String content = "# " + projectName + " Maven聚合项目\n\n" +
"这是一个多模块Maven项目模板,通过模块化设计组织Java应用程序。\n\n" +
"## 项目结构\n\n" +
"```\n" +
projectName + "/\n";
// 添加模块目录结构
for (String module : modules) {
content += "├── " + module + "/\n";
}
content += "```\n\n" +
"## 模块说明\n\n" +
modulesDescription.toString() + "\n" +
"## 开始使用\n\n" +
"1. 根据需要修改各模块的`pom.xml`文件\n" +
"2. 在相应模块中添加源代码\n" +
"3. 使用以下命令构建项目:\n\n" +
"```bash\n" +
"mvn clean install\n" +
"```\n";
writeToFile(projectPath.resolve("README.md"), content);
}
private void writeGitignore(Path projectPath) {
String content = "# Maven\n" +
"target/\n" +
"pom.xml.tag\n" +
"pom.xml.releaseBackup\n" +
"pom.xml.versionsBackup\n" +
"pom.xml.next\n" +
"release.properties\n" +
"dependency-reduced-pom.xml\n" +
"buildNumber.properties\n" +
".mvn/timing.properties\n" +
".mvn/wrapper/maven-wrapper.jar\n\n" +
"# IntelliJ IDEA\n" +
".idea/\n" +
"*.iws\n" +
"*.iml\n" +
"*.ipr\n\n" +
"# Eclipse\n" +
".classpath\n" +
".project\n" +
".settings/\n\n" +
"# Mac\n" +
".DS_Store\n";
writeToFile(projectPath.resolve(".gitignore"), content);
}
private void writeModulePom(Path modulePath, String groupId, String parentArtifactId, String version, String projectName) {
// 获取模块名称
String moduleName = modulePath.getFileName().toString();
// 新的 artifactId: 父项目名称-子模块名
//String newArtifactId = parentArtifactId + "-" + moduleName;
String newArtifactId = moduleName;
// 构建 pom.xml 内容
String content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n" +
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n" +
" <modelVersion>4.0.0</modelVersion>\n" +
" <parent>\n" +
" <groupId>" + groupId + "</groupId>\n" +
" <artifactId>" + parentArtifactId + "</artifactId>\n" +
" <version>" + version + "</version>\n" +
" </parent>\n" +
" <artifactId>" + newArtifactId + "</artifactId>\n" + // 使用新的 artifactId
" <packaging>jar</packaging>\n" +
"</project>";
// 写入文件
writeToFile(modulePath.resolve("pom.xml"), content);
// 可选:手动验证 pom.xml 内容
LOG.info("Generated pom.xml content for module " + moduleName + ":\n" + content);
}
private void addModuleDependencies(Path projectPath, String groupId, String version, String parentArtifactId, String[] modules) {
LOG.info("开始添加模块间依赖关系...");
LOG.info("项目路径: " + projectPath);
LOG.info("父项目 artifactId: " + parentArtifactId);
LOG.info("模块列表: " + Arrays.toString(modules));
// 检查每个模块的 pom.xml 文件状态
for (String module : modules) {
Path modulePath = projectPath.resolve(parentArtifactId + "-" + module);
Path pomPath = modulePath.resolve("pom.xml");
LOG.info("Before adding dependencies, POM file existence for module " + module + ": " + Files.exists(pomPath));
}
// 默认依赖关系:api -> service -> mapper -> pojo -> common
for (String module : modules) {
// 使用父项目名-子模块名的格式创建目录,moduleName 也满足此格式
String moduleName = parentArtifactId + "-" + module;
LOG.info("处理模块: " + moduleName);
if (module.equals("api") && containsModule(modules, "service")) {
LOG.info("为模块 [api] 添加依赖: service");
addDependencyToModule(projectPath.resolve(parentArtifactId + "-" + "api"), groupId, parentArtifactId, "service", version);
} else if (module.equals("service") && containsModule(modules, "mapper")) {
LOG.info("为模块 [service] 添加依赖: mapper");
addDependencyToModule(projectPath.resolve(parentArtifactId + "-" + "service"), groupId, parentArtifactId, "mapper", version);
} else if (module.equals("mapper") && containsModule(modules, "pojo")) {
LOG.info("为模块 [mapper] 添加依赖: pojo");
addDependencyToModule(projectPath.resolve(parentArtifactId + "-" + "mapper"), groupId, parentArtifactId, "pojo", version);
} else if (module.equals("pojo") && containsModule(modules, "common")) {
LOG.info("为模块 [pojo] 添加依赖: common");
addDependencyToModule(projectPath.resolve(parentArtifactId + "-" + "pojo"), groupId, parentArtifactId, "common", version);
} else {
LOG.info("模块 [" + moduleName + "] 无需添加依赖");
}
}
LOG.info("模块间依赖关系添加完成");
}
private void addDependencyToModule(Path modulePath, String groupId, String parentArtifactId, String moduleName, String version) {
try {
Path pomPath = modulePath.resolve("pom.xml");
LOG.info("POM file path for module " + modulePath + ": " + pomPath);
if (!Files.exists(pomPath)) {
LOG.warn("POM file does not exist for module: " + modulePath);
return;
}
String content = new String(Files.readAllBytes(pomPath));
LOG.info("Original POM content for module " + modulePath + ":\n" + content);
String dependencyXml = " <dependency>\n" +
" <groupId>" + groupId + "</groupId>\n" +
" <artifactId>" + parentArtifactId + "-" + moduleName + "</artifactId>\n" +
" <version>" + version + "</version>\n" +
" </dependency>\n";
if (content.contains("</dependencies>")) {
// 已有依赖,在</dependencies>前添加
int index = content.indexOf("</dependencies>");
content = content.substring(0, index) + dependencyXml + content.substring(index);
} else if (content.contains("</project>")) {
// 没有依赖部分,在</project>前添加
int index = content.indexOf("</project>");
content = content.substring(0, index) + " <dependencies>\n" + dependencyXml + " </dependencies>\n" + content.substring(index);
} else {
LOG.warn("No suitable place to insert dependency in POM file for module: " + modulePath);
return;
}
LOG.info("Updated POM content for module " + modulePath + ":\n" + content);
Files.write(pomPath, content.getBytes());
} catch (IOException e) {
LOG.warn("Failed to add dependency to module: " + modulePath, e);
}
}
private void writeToFile(Path path, String content) {
try {
// 创建父目录(如果不存在)
Files.createDirectories(path.getParent());
// 写入文件内容
try (BufferedWriter writer = Files.newBufferedWriter(path)) {
writer.write(content);
}
} catch (IOException e) {
LOG.warn("Failed to write file: " + path, e);
}
}
private void createDirectoryStructure(Path path) {
try {
Files.createDirectories(path);
} catch (IOException e) {
LOG.warn("Failed to create directory: " + path, e);
}
}
private boolean containsModule(String[] modules, String moduleName) {
for (String module : modules) {
if (module.equals(moduleName)) {
return true;
}
}
return false;
}
}

41
src/main/java/com/wd/maven/aggregation/DebounceDocumentListener.java

@ -0,0 +1,41 @@
package com.wd.maven.aggregation;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class DebounceDocumentListener implements DocumentListener {
private final Timer timer;
private final Runnable action;
private final int delay;
public DebounceDocumentListener(Runnable action, int delay) {
this.action = action;
this.delay = delay;
this.timer = new Timer(delay, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DebounceDocumentListener.this.action.run();
}
});
this.timer.setRepeats(false);
}
@Override
public void insertUpdate(DocumentEvent e) {
timer.restart();
}
@Override
public void removeUpdate(DocumentEvent e) {
timer.restart();
}
@Override
public void changedUpdate(DocumentEvent e) {
timer.restart();
}
}

56
src/main/java/com/wd/maven/aggregation/MavenAggregationProjectGenerator.java

@ -0,0 +1,56 @@
package com.wd.maven.aggregation;
import com.intellij.ide.util.projectWizard.WebProjectTemplate;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.wd.maven.aggregation.AggregationProjectGenerator;
import com.wd.maven.aggregation.MavenAggregationSettings;
import com.wd.maven.aggregation.MavenAggregationSettingsPanel;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
public class MavenAggregationProjectGenerator extends WebProjectTemplate<MavenAggregationSettings> {
@NotNull
@Override
public String getName() {
return "Maven Aggregation Project";
}
@Override
public String getDescription() {
return "创建标准的Maven多模块项目结构,包含父POM和子模块";
}
@Nullable
@Override
public Icon getIcon() {
return null; // 可以返回一个自定义图标
}
@NotNull
public MavenAggregationSettings createSettings() {
return new MavenAggregationSettings();
}
@Nullable
public JComponent getSettingsPanel(MavenAggregationSettings settings) {
return new MavenAggregationSettingsPanel(settings).getPanel();
}
@Override
public void generateProject(@NotNull Project project, @NotNull VirtualFile baseDir, @NotNull MavenAggregationSettings settings, @NotNull Module module) {
AggregationProjectGenerator generator = new AggregationProjectGenerator();
generator.generateProject(
project,
settings.getGroupId(),
settings.getArtifactId(),
settings.getVersion(),
settings.getModules(),
settings.getJavaVersion()
);
}
}

54
src/main/java/com/wd/maven/aggregation/MavenAggregationSettings.java

@ -0,0 +1,54 @@
package com.wd.maven.aggregation;
public class MavenAggregationSettings {
private String groupId = "com.example";
private String artifactId = "demo";
private String version = "1.0-SNAPSHOT";
private String javaVersion = "8";
private String[] modules = {"api", "common", "mapper", "pojo", "service"};
public String getGroupId() {
return groupId;
}
public void setGroupId(String groupId) {
this.groupId = groupId;
}
public String getArtifactId() {
return artifactId;
}
public void setArtifactId(String artifactId) {
this.artifactId = artifactId;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getJavaVersion() {
return javaVersion;
}
public void setJavaVersion(String javaVersion) {
this.javaVersion = javaVersion;
}
public String[] getModules() {
return modules;
}
public void setModules(String[] modules) {
this.modules = modules;
}
public MavenAggregationSettings() { }
}

227
src/main/java/com/wd/maven/aggregation/MavenAggregationSettingsPanel.java

@ -0,0 +1,227 @@
package com.wd.maven.aggregation;
import com.intellij.ui.components.JBCheckBox;
import com.intellij.ui.components.JBLabel;
import com.intellij.ui.components.JBTextField;
import com.intellij.util.ui.UIUtil;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MavenAggregationSettingsPanel {
private JPanel mainPanel;
private JBTextField groupIdField;
private JBTextField artifactIdField;
private JBTextField versionField;
private JBTextField modulesField;
private JComboBox<String> javaVersionComboBox;
// 预定义模块复选框
private JBCheckBox apiCheckBox;
private JBCheckBox commonCheckBox;
private JBCheckBox mapperCheckBox;
private JBCheckBox pojoCheckBox;
private JBCheckBox serviceCheckBox;
private final MavenAggregationSettings settings;
public MavenAggregationSettingsPanel(MavenAggregationSettings settings) {
this.settings = settings;
createUI();
initValues();
}
private void createUI() {
mainPanel = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.insets = new Insets(5, 5, 5, 5);
// Group ID
c.gridx = 0;
c.gridy = 0;
mainPanel.add(new JBLabel("Group ID:"), c);
c.gridx = 1;
c.weightx = 1.0;
groupIdField = new JBTextField();
mainPanel.add(groupIdField, c);
// Artifact ID
c.gridx = 0;
c.gridy = 1;
c.weightx = 0.0;
mainPanel.add(new JBLabel("Artifact ID:"), c);
c.gridx = 1;
c.weightx = 1.0;
artifactIdField = new JBTextField();
mainPanel.add(artifactIdField, c);
// Version
c.gridx = 0;
c.gridy = 2;
c.weightx = 0.0;
mainPanel.add(new JBLabel("Version:"), c);
c.gridx = 1;
c.weightx = 1.0;
versionField = new JBTextField();
mainPanel.add(versionField, c);
// Java Version
c.gridx = 0;
c.gridy = 3;
c.weightx = 0.0;
mainPanel.add(new JBLabel("Java Version:"), c);
c.gridx = 1;
c.weightx = 1.0;
javaVersionComboBox = new JComboBox<>(new String[]{"8", "11", "17", "21"});
mainPanel.add(javaVersionComboBox, c);
// 预定义模块
c.gridx = 0;
c.gridy = 4;
c.weightx = 0.0;
mainPanel.add(new JBLabel("预定义模块:"), c);
// 模块复选框面板
JPanel modulesPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
apiCheckBox = new JBCheckBox("api", true);
commonCheckBox = new JBCheckBox("common", true);
mapperCheckBox = new JBCheckBox("mapper", true);
pojoCheckBox = new JBCheckBox("pojo", true);
serviceCheckBox = new JBCheckBox("service", true);
modulesPanel.add(apiCheckBox);
modulesPanel.add(commonCheckBox);
modulesPanel.add(mapperCheckBox);
modulesPanel.add(pojoCheckBox);
modulesPanel.add(serviceCheckBox);
c.gridx = 1;
c.weightx = 1.0;
mainPanel.add(modulesPanel, c);
// 自定义模块
c.gridx = 0;
c.gridy = 5;
c.weightx = 0.0;
mainPanel.add(new JBLabel("自定义模块 (逗号分隔):"), c);
c.gridx = 1;
c.weightx = 1.0;
modulesField = new JBTextField();
mainPanel.add(modulesField, c);
// 添加监听器
groupIdField.getDocument().addDocumentListener(new DebounceDocumentListener(() -> {
settings.setGroupId(groupIdField.getText().trim());
}, 300));
artifactIdField.getDocument().addDocumentListener(new DebounceDocumentListener(() -> {
settings.setArtifactId(artifactIdField.getText().trim());
}, 300));
versionField.getDocument().addDocumentListener(new DebounceDocumentListener(() -> {
settings.setVersion(versionField.getText().trim());
}, 300));
javaVersionComboBox.addActionListener(e -> {
String selectedVersion = (String) javaVersionComboBox.getSelectedItem();
if (isValidJavaVersion(selectedVersion)) {
settings.setJavaVersion(selectedVersion);
} else {
// 默认回退到 17
settings.setJavaVersion("17");
// 确保在 EDT 中更新 UI
UIUtil.invokeLaterIfNeeded(() -> {
javaVersionComboBox.setSelectedItem("17");
JOptionPane.showMessageDialog(mainPanel,
"不支持的 Java 版本:" + selectedVersion + ",已自动切换为 Java 17。",
"警告",
JOptionPane.WARNING_MESSAGE);
});
}
});
modulesField.getDocument().addDocumentListener(new DebounceDocumentListener(this::updateModules, 300));
// 模块变更监听器
ItemListener moduleListener = e -> updateModules();
apiCheckBox.addItemListener(moduleListener);
commonCheckBox.addItemListener(moduleListener);
mapperCheckBox.addItemListener(moduleListener);
pojoCheckBox.addItemListener(moduleListener);
serviceCheckBox.addItemListener(moduleListener);
}
// 新增辅助方法
private boolean isValidJavaVersion(String version) {
return Arrays.asList("8", "11", "17", "21").contains(version);
}
private void initValues() {
groupIdField.setText(settings.getGroupId());
artifactIdField.setText(settings.getArtifactId());
versionField.setText(settings.getVersion());
javaVersionComboBox.setSelectedItem(settings.getJavaVersion());
// 设置模块选择状态
String[] modules = settings.getModules();
for (String module : modules) {
switch (module) {
case "api":
apiCheckBox.setSelected(true);
break;
case "common":
commonCheckBox.setSelected(true);
break;
case "mapper":
mapperCheckBox.setSelected(true);
break;
case "pojo":
pojoCheckBox.setSelected(true);
break;
case "service":
serviceCheckBox.setSelected(true);
break;
default:
// 自定义模块,添加到文本框
if (modulesField.getText().isEmpty()) {
modulesField.setText(module);
} else {
modulesField.setText(modulesField.getText() + ", " + module);
}
}
}
}
private void updateModules() {
List<String> modulesList = new ArrayList<>();
// 添加选中的预定义模块
if (apiCheckBox.isSelected()) modulesList.add("api");
if (commonCheckBox.isSelected()) modulesList.add("common");
if (mapperCheckBox.isSelected()) modulesList.add("mapper");
if (pojoCheckBox.isSelected()) modulesList.add("pojo");
if (serviceCheckBox.isSelected()) modulesList.add("service");
// 添加自定义模块
String customModules = modulesField.getText().trim();
if (!customModules.isEmpty()) {
modulesList.addAll(Arrays.asList(customModules.split("\\s*,\\s*")));
}
settings.setModules(modulesList.toArray(new String[0]));
}
public JPanel getPanel() {
return mainPanel;
}
}

42
src/main/java/com/wd/maven/aggregation/QuickstartAggregationAction.java

@ -0,0 +1,42 @@
package com.wd.maven.aggregation;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectUtil;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.vfs.VirtualFile;
public class QuickstartAggregationAction extends AnAction {
@Override
public void actionPerformed(AnActionEvent e) {
Project project = e.getProject();
if (project == null) return;
// 创建对话框
AggregationProjectDialog dialog = new AggregationProjectDialog(project);
if (dialog.showAndGet()) {
// 用户点击了确定
String groupId = dialog.getGroupId();
String artifactId = dialog.getArtifactId();
String version = dialog.getVersion();
String[] modules = dialog.getModules();
String javaVersion = dialog.getJavaVersion();
// 生成项目
AggregationProjectGenerator generator = new AggregationProjectGenerator();
generator.generateProject(project, groupId, artifactId, version, modules, javaVersion);
// 刷新项目视图
refreshProjectView(project);
}
}
private void refreshProjectView(Project project) {
VirtualFile baseDir = ProjectUtil.guessProjectDir(project);
if (baseDir != null) {
baseDir.refresh(false, true);
}
}
}

27
src/main/java/com/wd/maven/aggregation/SimpleDocumentListener.java

@ -0,0 +1,27 @@
package com.wd.maven.aggregation;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
public class SimpleDocumentListener implements DocumentListener {
private final Runnable action;
public SimpleDocumentListener(Runnable action) {
this.action = action;
}
@Override
public void insertUpdate(DocumentEvent e) {
action.run();
}
@Override
public void removeUpdate(DocumentEvent e) {
action.run();
}
@Override
public void changedUpdate(DocumentEvent e) {
action.run();
}
}

52
src/main/resources/META-INF/plugin.xml

@ -0,0 +1,52 @@
<!-- Plugin Configuration File. Read more: https://plugins.jetbrains.com/docs/intellij/plugin-configuration-file.html -->
<idea-plugin>
<!-- Unique identifier of the plugin. It should be FQN. It cannot be changed between the plugin versions. -->
<id>com.wd.maven-aggregation</id>
<!-- Public plugin name should be written in Title Case.
Guidelines: https://plugins.jetbrains.com/docs/marketplace/plugin-overview-page.html#plugin-name -->
<name>Maven-aggregation Quickstart</name>
<!-- A displayed Vendor name or Organization ID displayed on the Plugins Page. -->
<vendor email="1938023944@qq.com" url="https://www.wandong.com">wandong</vendor>
<!-- Description of the plugin displayed on the Plugin Page and IDE Plugin Manager.
Simple HTML elements (text formatting, paragraphs, and lists) can be added inside of <![CDATA[ ]]> tag.
Guidelines: https://plugins.jetbrains.com/docs/marketplace/plugin-overview-page.html#plugin-description -->
<description><![CDATA[
<p>Maven聚合项目快速生成插件,帮助您快速创建标准的多模块Maven项目结构。</p>
<p><b>主要功能:</b></p>
<ul>
<li>一键创建Maven多模块项目结构</li>
<li>自动配置模块间的依赖关系</li>
<li>支持自定义模块名称</li>
<li>支持选择Java版本</li>
<li>自动生成项目README和.gitignore文件</li>
</ul>
<p><b>使用方法:</b></p>
<p>在IDEA中,选择"File > New > Create Maven Aggregation Project",然后按照向导完成配置。</p>
]]></description>
<!-- Product and plugin compatibility requirements.
Read more: https://plugins.jetbrains.com/docs/intellij/plugin-compatibility.html -->
<depends>com.intellij.modules.platform</depends>
<!-- Extension points defined by the plugin.
Read more: https://plugins.jetbrains.com/docs/intellij/plugin-extension-points.html -->
<extensions defaultExtensionNs="com.intellij">
</extensions>
<actions>
<action id="QuickstartAggregationAction" class="com.wd.maven.aggregation.QuickstartAggregationAction"
text="Create Maven Aggregation Project" description="Creates a new Maven multi-module project template">
<!-- <add-to-group group-id="NewGroup" anchor="first"/>-->
<!-- <add-to-group group-id="NewProjectOrModuleGroup" anchor="first"/>-->
<add-to-group group-id="NewGroup" anchor="first"/>
</action>
</actions>
</idea-plugin>

12
src/main/resources/META-INF/pluginIcon.svg

@ -0,0 +1,12 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M32.0845 7.94025V4H24.0203V7.9896H16.029V4H7.91553V7.94025H4V36H16.0044V32.0045C16.0058 30.9457 16.4274 29.9308 17.1766 29.1826C17.9258 28.4345 18.9412 28.0143 20 28.0143C21.0588 28.0143 22.0743 28.4345 22.8234 29.1826C23.5726 29.9308 23.9942 30.9457 23.9956 32.0045V36H36V7.94025H32.0845Z"
fill="url(#paint0_linear)"/>
<defs>
<linearGradient id="paint0_linear" x1="2.94192" y1="4.89955" x2="37.7772" y2="39.7345"
gradientUnits="userSpaceOnUse">
<stop offset="0.15937" stop-color="#3BEA62"/>
<stop offset="0.5404" stop-color="#3C99CC"/>
<stop offset="0.93739" stop-color="#6B57FF"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 818 B

Loading…
Cancel
Save