commit 94ebe1cff07f35a20a6e7e44c136a99045310593 Author: wandong <1938023944@qq.com> Date: Fri Jul 18 17:49:30 2025 +0800 项目初始化 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..61b5077 --- /dev/null +++ b/.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 \ No newline at end of file diff --git a/.run/Run IDE with Plugin.run.xml b/.run/Run IDE with Plugin.run.xml new file mode 100644 index 0000000..7747a29 --- /dev/null +++ b/.run/Run IDE with Plugin.run.xml @@ -0,0 +1,24 @@ + + + + + + + + true + true + false + + + \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..b59de78 --- /dev/null +++ b/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 { + sourceCompatibility = "17" + targetCompatibility = "17" + } + withType { + 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")) + } +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..24630b3 --- /dev/null +++ b/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 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..249e583 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..c4ecfc0 --- /dev/null +++ b/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 diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..1b6c787 --- /dev/null +++ b/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" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..ac1b06f --- /dev/null +++ b/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 diff --git a/path/to/LatestVersionResolver.kt b/path/to/LatestVersionResolver.kt new file mode 100644 index 0000000..e2e860f --- /dev/null +++ b/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") +} +// 原有逻辑 \ No newline at end of file diff --git a/readMe.md b/readMe.md new file mode 100644 index 0000000..b7766cb --- /dev/null +++ b/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) + +--- + diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..688213b --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,8 @@ +pluginManagement { + repositories { + mavenCentral() + gradlePluginPortal() + } +} + +rootProject.name = "maven-aggregation" \ No newline at end of file diff --git a/src/main/java/com/wd/maven/aggregation/AggregationProjectDialog.java b/src/main/java/com/wd/maven/aggregation/AggregationProjectDialog.java new file mode 100644 index 0000000..8677876 --- /dev/null +++ b/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 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 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]); + } +} \ No newline at end of file diff --git a/src/main/java/com/wd/maven/aggregation/AggregationProjectGenerator.java b/src/main/java/com/wd/maven/aggregation/AggregationProjectGenerator.java new file mode 100644 index 0000000..cbb02b1 --- /dev/null +++ b/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(" ").append(moduleName).append("\n"); + } + + StringBuilder dependencyManagementXml = new StringBuilder(); + for (String module : modules) { + dependencyManagementXml.append(" \n") + .append(" ").append(groupId).append("\n") + .append(" ").append(artifactId).append("-").append(module).append("\n") // 使用正确的 artifactId + .append(" ${project.version}\n") + .append(" \n"); + } + + String content = "\n" + + "\n" + + " 4.0.0\n" + + "\n" + + " " + groupId + "\n" + + " " + artifactId + "\n" + + " " + version + "\n" + + " pom\n" + + "\n" + + " \n" + + moduleXml.toString() + + " \n" + + "\n" + + " \n" + + " " + javaVersion + "\n" + + " " + javaVersion + "\n" + + " UTF-8\n" + + " \n" + + "\n" + + " \n" + + " \n" + + " \n" + + dependencyManagementXml.toString() + + " \n" + + " \n" + + ""; + + 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 = "\n" + + "\n" + + " 4.0.0\n" + + " \n" + + " " + groupId + "\n" + + " " + parentArtifactId + "\n" + + " " + version + "\n" + + " \n" + + " " + newArtifactId + "\n" + // 使用新的 artifactId + " jar\n" + + ""; + + // 写入文件 + 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 = " \n" + + " " + groupId + "\n" + + " " + parentArtifactId + "-" + moduleName + "\n" + + " " + version + "\n" + + " \n"; + + if (content.contains("")) { + // 已有依赖,在前添加 + int index = content.indexOf(""); + content = content.substring(0, index) + dependencyXml + content.substring(index); + } else if (content.contains("")) { + // 没有依赖部分,在前添加 + int index = content.indexOf(""); + content = content.substring(0, index) + " \n" + dependencyXml + " \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; + } + + + +} \ No newline at end of file diff --git a/src/main/java/com/wd/maven/aggregation/DebounceDocumentListener.java b/src/main/java/com/wd/maven/aggregation/DebounceDocumentListener.java new file mode 100644 index 0000000..fff8886 --- /dev/null +++ b/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(); + } +} \ No newline at end of file diff --git a/src/main/java/com/wd/maven/aggregation/MavenAggregationProjectGenerator.java b/src/main/java/com/wd/maven/aggregation/MavenAggregationProjectGenerator.java new file mode 100644 index 0000000..64a7fc6 --- /dev/null +++ b/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 { + + @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() + ); + } +} \ No newline at end of file diff --git a/src/main/java/com/wd/maven/aggregation/MavenAggregationSettings.java b/src/main/java/com/wd/maven/aggregation/MavenAggregationSettings.java new file mode 100644 index 0000000..596f6ac --- /dev/null +++ b/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() { } +} + diff --git a/src/main/java/com/wd/maven/aggregation/MavenAggregationSettingsPanel.java b/src/main/java/com/wd/maven/aggregation/MavenAggregationSettingsPanel.java new file mode 100644 index 0000000..e5f399d --- /dev/null +++ b/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 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 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; + } +} \ No newline at end of file diff --git a/src/main/java/com/wd/maven/aggregation/QuickstartAggregationAction.java b/src/main/java/com/wd/maven/aggregation/QuickstartAggregationAction.java new file mode 100644 index 0000000..db24cce --- /dev/null +++ b/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); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/wd/maven/aggregation/SimpleDocumentListener.java b/src/main/java/com/wd/maven/aggregation/SimpleDocumentListener.java new file mode 100644 index 0000000..0cd5f0a --- /dev/null +++ b/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(); + } +} \ No newline at end of file diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml new file mode 100644 index 0000000..37ed2ec --- /dev/null +++ b/src/main/resources/META-INF/plugin.xml @@ -0,0 +1,52 @@ + + + + com.wd.maven-aggregation + + + Maven-aggregation Quickstart + + + wandong + + + Maven聚合项目快速生成插件,帮助您快速创建标准的多模块Maven项目结构。

+ +

主要功能:

+
    +
  • 一键创建Maven多模块项目结构
  • +
  • 自动配置模块间的依赖关系
  • +
  • 支持自定义模块名称
  • +
  • 支持选择Java版本
  • +
  • 自动生成项目README和.gitignore文件
  • +
+ +

使用方法:

+

在IDEA中,选择"File > New > Create Maven Aggregation Project",然后按照向导完成配置。

+ ]]>
+ + + com.intellij.modules.platform + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/src/main/resources/META-INF/pluginIcon.svg b/src/main/resources/META-INF/pluginIcon.svg new file mode 100644 index 0000000..dcf6b99 --- /dev/null +++ b/src/main/resources/META-INF/pluginIcon.svg @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file