commit fff86c1dd51478b340df978a7843a701f2540526 Author: chengjie Date: Mon Dec 16 15:10:27 2024 +0800 initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a522f44 --- /dev/null +++ b/.gitignore @@ -0,0 +1,97 @@ +# 前端============================================== +# Logs +**/logs/ +**/*.log +**/npm-debug.log* +**/yarn-debug.log* +**/yarn-error.log* +**/pnpm-debug.log* +**/lerna-debug.log* + +**/node_modules/ +**/dist/ +**/dist-ssr/ +**/coverage/ +**/*.local +**/package-lock.json +**/pnpm-lock.yaml +**/contribution/frontend-components.json +**/java-src/main/resources/ui/*.html + +**/cypress/videos/ +**/cypress/screenshots/ + +# Editor directories and files +**/.vscode/* +!**/.vscode/extensions.json +**/.idea/ +**/*.suo +**/*.ntvs* +**/*.njsproj +**/*.sln +**/*.sw? + +**/test-results/ +**/playwright-report/ + +# 后端============================================== +# mac os 隐藏文件 +**/.DS_Store + +# 缓存缩略图文件 +**/Thumbs.db + +# gradle 文件夹 +**/.gradle/ + +# svn 文件夹 +**/.svn/ + +# cvs 文件夹及文件 +**/.checkstyle +**/.cvsignore + +# eclipse project 文件夹及文件 +**/.settings/ +**/.classpath +**/.project + +# idea project 文件夹及文件 +**/*.ipr +**/*.iws +**/*.iml +**/.shelf + +# eclipse 构建文件夹 +**/bin/ + +# idea 构建文件夹 +**/out/ +**/work/ + +# gradle 构建文件夹 +**/build/ + +# 第三方工具自动产生的源代码文件夹 +**/src/generated/ + +# spring boot 框架应用运行时自动生成的文件夹 +**/app.*/config/ +**/app.*/logs/ +**/app.*/work/ +**/app.*/tmp/ + +# 日志文件夹及文件 +**/logs/ +**/*.log + +# 所有 jar 文件 +**/*.jar + +# 所有 jrebel 文件 +**/rebel.xml + +# 保留 gradle wrapper 的 jar 文件 +!gradle/wrapper/gradle-wrapper.jar + + diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 0000000..c9ebbed --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,2 @@ += 6.0.0(2022-04-29) +. 初始版本发布 diff --git a/README.adoc b/README.adoc new file mode 100644 index 0000000..e69de29 diff --git a/app.engine.rwa/README.adoc b/app.engine.rwa/README.adoc new file mode 100644 index 0000000..e69de29 diff --git a/app.engine.rwa/build-common.gradle b/app.engine.rwa/build-common.gradle new file mode 100644 index 0000000..b1acd61 --- /dev/null +++ b/app.engine.rwa/build-common.gradle @@ -0,0 +1,19 @@ +/** + * 设置打包文件的运行时目标环境(target) + * 设置方式: 通过命令行 -D 传入目标环境参数 + * 打包命令如下: + * 1. gradle bootwar # 默认, target=tomcat + * 2. gradle bootwar -Dtarget=undertow # undertow, target=undertow + * 3. gradle bootwar -Dtarget=jetty # jetty, target=jetty + */ +def target =System.getProperty("target") ?: "tomcat"; +System.setProperty('target',target); + +// 根据 targetRuntime 变量的值执行实际的 build.gradle +apply from: "build-${target}.gradle" + +// 应用启动项目无需发布到仓库中 +publishPublicationPublicationToMavenRepository.enabled=false + +// 开启 docker 镜像生成任务 +jibBuildTar.enabled =true \ No newline at end of file diff --git a/app.engine.rwa/build-jetty.gradle b/app.engine.rwa/build-jetty.gradle new file mode 100644 index 0000000..6cf0205 --- /dev/null +++ b/app.engine.rwa/build-jetty.gradle @@ -0,0 +1,15 @@ +println "[Jetty] 环境 ......" + +configurations { + all*.exclude group: "org.springframework.boot", module: "spring-boot-starter-tomcat" + all*.exclude group: "org.apache.tomcat.embed", module: "tomcat-embed-core" + all*.exclude group: "org.apache.tomcat.embed", module: "tomcat-embed-websocket" +} + +dependencies { + implementation("org.springframework.boot:spring-boot-starter-jetty") + + providedRuntime( + "org.springframework.boot:spring-boot-starter-jetty", + ) +} diff --git a/app.engine.rwa/build-tomcat.gradle b/app.engine.rwa/build-tomcat.gradle new file mode 100644 index 0000000..a9d85e4 --- /dev/null +++ b/app.engine.rwa/build-tomcat.gradle @@ -0,0 +1,7 @@ +println "[Tomcat] 环境 ......" + +dependencies { + providedRuntime( + "org.springframework.boot:spring-boot-starter-tomcat", + ) +} diff --git a/app.engine.rwa/build-undertow.gradle b/app.engine.rwa/build-undertow.gradle new file mode 100644 index 0000000..00d3b49 --- /dev/null +++ b/app.engine.rwa/build-undertow.gradle @@ -0,0 +1,15 @@ +println "[Undertow] 环境 ......" + +configurations { + all*.exclude group: "org.springframework.boot", module: "spring-boot-starter-tomcat" + all*.exclude group: "org.apache.tomcat.embed", module: "tomcat-embed-core" + all*.exclude group: "org.apache.tomcat.embed", module: "tomcat-embed-websocket" +} + +dependencies { + implementation("org.springframework.boot:spring-boot-starter-undertow") + + providedRuntime( + "org.springframework.boot:spring-boot-starter-undertow", + ) +} diff --git a/app.engine.rwa/build.gradle b/app.engine.rwa/build.gradle new file mode 100644 index 0000000..1381f8f --- /dev/null +++ b/app.engine.rwa/build.gradle @@ -0,0 +1,103 @@ +apply plugin: 'war' +apply plugin: 'com.google.cloud.tools.jib' + +apply from: "build-common.gradle" + +dependencies { + implementation("org.springframework.boot:spring-boot-starter-web"){ + exclude group: "org.springframework.boot", module: "spring-boot-starter-tomcat" + } +} + +dependencies { + implementation ( + project(":io.sc.engine.rwa"), + + "io.sc:io.sc.platform.app:${platform_version}", + "io.sc:io.sc.platform.security.loginform:${platform_version}", + "io.sc:io.sc.platform.developer:${platform_version}", + ) +} + +/** + * replace [application.version] in i18n message file + */ +processResources { + filesMatching('**/messages*.properties') { + println 'replace ${version} in [' + it + ']' + filteringCharset = 'iso8859-1' + filter(org.apache.tools.ant.filters.ReplaceTokens, beginToken: '$version', endToken: '',tokens: [version: '' + project.version]) + } + + doLast{ + // 为了能够兼容 eclipse 和 idea 两种开发环境,调整如下: + // 1. 将 environment.properties 文件放在了 src/main/resources 目录中 + // 2. 在打包时,将该文件删除 + delete "$buildDir/resources/main/running-mode.properties" + } + +} + +bootWar{ + mainClass = "${project.name}.Application" + //launchScript() + manifest { + attributes 'Implementation-Version': archiveVersion, + 'Implementation-Title': project.name + } +} + +bootJar{ + mainClass = "${project.name}.Application" + //launchScript() + manifest { + attributes 'Implementation-Version': archiveVersion, + 'Implementation-Title': project.name + } +} + + +jib { + outputPaths { + tar = "build/libs/${project.name}-${project.version}-image.tar" + } + from { + image = "openjdk:8u342-slim" + //image = "eclipse-temurin:8u382-b05-jdk-focal" + platforms { + platform { + architecture ="arm64" + os ="linux" + } + } + } + to { + image = "${project.name}:${project.version}" + } + extraDirectories { + paths { + path { + from = "build/libs/" + into = "/opt/${project.name}/" + includes = ["${project.name}-${project.version}.war"] + } + } + } + container { + /** + * 设置jvm的启动参数 + * user.timezone - 解决Java程序的时区问题 + */ + jvmFlags = ["-Duser.timezone=Asia/Shanghai"] + creationTime = "USE_CURRENT_TIMESTAMP" + ports = ["8080"] + entrypoint = [ + "java", + "-jar", + "/opt/" + project.name + "/" + project.name + "-" + project.version + ".war", + "--" + project.name + ".home.dir=" + "/opt/" + project.name + ] + //entrypoint = "java -version" + //appRoot = "/usr/local/tomcat/webapps/ROOT" + } +} diff --git a/app.engine.rwa/gradle.properties b/app.engine.rwa/gradle.properties new file mode 100644 index 0000000..e69de29 diff --git a/app.engine.rwa/src/main/java/app/engine/rwa/Application.java b/app.engine.rwa/src/main/java/app/engine/rwa/Application.java new file mode 100644 index 0000000..6c47cf6 --- /dev/null +++ b/app.engine.rwa/src/main/java/app/engine/rwa/Application.java @@ -0,0 +1,16 @@ +package app.engine.rwa; + +import io.sc.platform.core.ApplicationLauncher; +import io.sc.platform.core.PlatformSpringBootServletInitializer; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.WebApplicationInitializer; + +/** + * 应用程序入口 + */ +@SpringBootApplication(proxyBeanMethods = false) +public class Application extends PlatformSpringBootServletInitializer implements WebApplicationInitializer { + public static void main(String[] args) throws Exception { + ApplicationLauncher.run(Application.class,args); + } +} diff --git a/app.engine.rwa/src/main/resources/META-INF/platform/plugins/messages.json b/app.engine.rwa/src/main/resources/META-INF/platform/plugins/messages.json new file mode 100644 index 0000000..39f16f7 --- /dev/null +++ b/app.engine.rwa/src/main/resources/META-INF/platform/plugins/messages.json @@ -0,0 +1,5 @@ +{ + "includes":[ + "app/engine/rwa/i18n/messages" + ] +} \ No newline at end of file diff --git a/app.engine.rwa/src/main/resources/app/engine/rwa/i18n/messages.properties b/app.engine.rwa/src/main/resources/app/engine/rwa/i18n/messages.properties new file mode 100644 index 0000000..8de427e --- /dev/null +++ b/app.engine.rwa/src/main/resources/app/engine/rwa/i18n/messages.properties @@ -0,0 +1,3 @@ +application.title=RWA Metering Engine +application.version=$version +application.copyright=Copyright \u00A9 2019\u20132022 \ No newline at end of file diff --git a/app.engine.rwa/src/main/resources/app/engine/rwa/i18n/messages_zh_CN.properties b/app.engine.rwa/src/main/resources/app/engine/rwa/i18n/messages_zh_CN.properties new file mode 100644 index 0000000..f3973ad --- /dev/null +++ b/app.engine.rwa/src/main/resources/app/engine/rwa/i18n/messages_zh_CN.properties @@ -0,0 +1,3 @@ +application.title=RWA \u8BA1\u91CF\u5F15\u64CE +application.version=$version +application.copyright=Copyright \u00A9 2019\u20132022 \ No newline at end of file diff --git a/app.engine.rwa/src/main/resources/datasource.ini b/app.engine.rwa/src/main/resources/datasource.ini new file mode 100644 index 0000000..880d2c8 --- /dev/null +++ b/app.engine.rwa/src/main/resources/datasource.ini @@ -0,0 +1,11 @@ +[engine] +JdbcDriver=org.sqlite.JDBC +JdbcUrl=jdbc:sqlite:/Users/wangshaoping/wspsc/workspace/wangshaoping/v11/engine-rwa/work/db/rwa.db +Username= +Password= + +[app] +JdbcDriver=com.mysql.cj.jdbc.Driver +JdbcUrl=jdbc:mysql://localhost:3306/platform?autoReconnect=true&allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai +Username=platform +Password=platform \ No newline at end of file diff --git a/app.engine.rwa/src/main/resources/running-mode.properties b/app.engine.rwa/src/main/resources/running-mode.properties new file mode 100644 index 0000000..e5b12e7 --- /dev/null +++ b/app.engine.rwa/src/main/resources/running-mode.properties @@ -0,0 +1 @@ +development=true \ No newline at end of file diff --git a/app.engine.rwa/src/main/resources/static/app.engine.rwa/images/background.svg b/app.engine.rwa/src/main/resources/static/app.engine.rwa/images/background.svg new file mode 100644 index 0000000..9d88e3a --- /dev/null +++ b/app.engine.rwa/src/main/resources/static/app.engine.rwa/images/background.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app.engine.rwa/src/main/resources/static/app.engine.rwa/images/logo.svg b/app.engine.rwa/src/main/resources/static/app.engine.rwa/images/logo.svg new file mode 100644 index 0000000..c8191d8 --- /dev/null +++ b/app.engine.rwa/src/main/resources/static/app.engine.rwa/images/logo.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/build-version.gradle b/build-version.gradle new file mode 100644 index 0000000..817a8e9 --- /dev/null +++ b/build-version.gradle @@ -0,0 +1,201 @@ +/*********************************************************************** + * 覆盖 springboot 默认包版本 + **********************************************************************/ +subprojects { + // ext['activemq.version'] = + // ext['antlr2.version'] = + // ext['appengine-sdk.version'] = + // ext['artemis.version'] = + // ext['aspectj.version'] = + // ext['assertj.version'] = + // ext['atomikos.version'] = + // ext['awaitility.version'] = + // ext['bitronix.version'] = + // ext['build-helper-maven-plugin.version'] = + // ext['byte-buddy.version'] = + // ext['caffeine.version'] = + // ext['cassandra-driver.version'] = + // ext['classmate.version'] = + // ext['commons-codec.version'] = + // ext['commons-dbcp2.version'] = + // ext['commons-lang3.version'] = + // ext['commons-pool.version'] = + // ext['commons-pool2.version'] = + // ext['couchbase-client.version'] = + // ext['db2-jdbc.version'] = + // ext['dependency-management-plugin.version'] = + // ext['derby.version'] = + // ext['dropwizard-metrics.version'] = + // ext['ehcache.version'] = + // ext['ehcache3.version'] = + // ext['elasticsearch.version'] = + // ext['embedded-mongo.version'] = + // ext['flyway.version'] = + // ext['freemarker.version'] = + // ext['git-commit-id-plugin.version'] = + // ext['glassfish-el.version'] = + // ext['glassfish-jaxb.version'] = + // ext['groovy.version'] = + // ext['gson.version'] = + // ext['h2.version'] = + // ext['hamcrest.version'] = + // ext['hazelcast.version'] = + // ext['hazelcast-hibernate5.version'] = + // ext['hibernate.version'] = + // ext['hibernate-validator.version'] = + // ext['hikaricp.version'] = + // ext['hsqldb.version'] = + // ext['htmlunit.version'] = + // ext['httpasyncclient.version'] = + // ext['httpclient.version'] = + // ext['httpcore.version'] = + // ext['infinispan.version'] = + // ext['influxdb-java.version'] = + // ext['jackson-bom.version'] = + // ext['jakarta-activation.version'] = + // ext['jakarta-annotation.version'] = + // ext['jakarta-jms.version'] = + // ext['jakarta-json.version'] = + // ext['jakarta-json-bind.version'] = + // ext['jakarta-mail.version'] = + // ext['jakarta-persistence.version'] = + // ext['jakarta-servlet.version'] = + // ext['jakarta-servlet-jsp-jstl.version'] = + // ext['jakarta-transaction.version'] = + // ext['jakarta-validation.version'] = + // ext['jakarta-websocket.version'] = + // ext['jakarta-ws-rs.version'] = + // ext['jakarta-xml-bind.version'] = + // ext['jakarta-xml-soap.version'] = + // ext['jakarta-xml-ws.version'] = + // ext['janino.version'] = + // ext['javax-activation.version'] = + // ext['javax-annotation.version'] = + // ext['javax-cache.version'] = + // ext['javax-jaxb.version'] = + // ext['javax-jaxws.version'] = + // ext['javax-jms.version'] = + // ext['javax-json.version'] = + // ext['javax-jsonb.version'] = + // ext['javax-mail.version'] = + // ext['javax-money.version'] = + // ext['javax-persistence.version'] = + // ext['javax-transaction.version'] = + // ext['javax-validation.version'] = + // ext['javax-websocket.version'] = + // ext['jaxen.version'] = + // ext['jaybird.version'] = + // ext['jboss-logging.version'] = + // ext['jboss-transaction-spi.version'] = + // ext['jdom2.version'] = + // ext['jedis.version'] = + // ext['jersey.version'] = + // ext['jetty.version'] = + // ext['jetty-el.version'] = + // ext['jetty-jsp.version'] = + // ext['jetty-reactive-httpclient.version'] = + // ext['jmustache.version'] = + // ext['johnzon.version'] = + // ext['jolokia.version'] = + // ext['jooq.version'] = + // ext['json-path.version'] = + // ext['json-smart.version'] = + // ext['jsonassert.version'] = + // ext['jstl.version'] = + // ext['jtds.version'] = + // ext['junit.version'] = + // ext['junit-jupiter.version'] = + // ext['kafka.version'] = + // ext['kotlin.version'] = + // ext['kotlin-coroutines.version'] = + // ext['lettuce.version'] = + // ext['liquibase.version'] = + // ext['log4j2.version'] = + // ext['logback.version'] = + // ext['lombok.version'] = + // ext['mariadb.version'] = + // ext['maven-antrun-plugin.version'] = + // ext['maven-assembly-plugin.version'] = + // ext['maven-clean-plugin.version'] = + // ext['maven-compiler-plugin.version'] = + // ext['maven-dependency-plugin.version'] = + // ext['maven-deploy-plugin.version'] = + // ext['maven-enforcer-plugin.version'] = + // ext['maven-failsafe-plugin.version'] = + // ext['maven-help-plugin.version'] = + // ext['maven-install-plugin.version'] = + // ext['maven-invoker-plugin.version'] = + // ext['maven-jar-plugin.version'] = + // ext['maven-javadoc-plugin.version'] = + // ext['maven-resources-plugin.version'] = + // ext['maven-shade-plugin.version'] = + // ext['maven-source-plugin.version'] = + // ext['maven-surefire-plugin.version'] = + // ext['maven-war-plugin.version'] = + // ext['micrometer.version'] = + // ext['mimepull.version'] = + // ext['mockito.version'] = + // ext['mongodb.version'] = + // ext['mssql-jdbc.version'] = + // ext['mysql.version'] = + // ext['nekohtml.version'] = + // ext['neo4j-java-driver.version'] = + // ext['netty.version'] = + // ext['netty-tcnative.version'] = + // ext['nimbus-jose-jwt.version'] = + // ext['oauth2-oidc-sdk.version'] = + // ext['ojdbc.version'] = + // ext['okhttp3.version'] = + // ext['oracle-database.version'] ='12.2.0.1' + // ext['pooled-jms.version'] = + // ext['postgresql.version'] = + // ext['prometheus-pushgateway.version'] = + // ext['quartz.version'] = + // ext['querydsl.version'] = + // ext['r2dbc-bom.version'] = + // ext['rabbit-amqp-client.version'] = + // ext['reactive-streams.version'] = + // ext['reactor-bom.version'] = + // ext['rest-assured.version'] = + // ext['rsocket.version'] = + // ext['rxjava.version'] = + // ext['rxjava-adapter.version'] = + // ext['rxjava2.version'] = + // ext['saaj-impl.version'] = + // ext['selenium.version'] = + // ext['selenium-htmlunit.version'] = + // ext['sendgrid.version'] = + // ext['servlet-api.version'] = + // ext['slf4j.version'] = + // ext['snakeyaml.version'] = + // ext['solr.version'] = + // ext['spring-amqp.version'] = + // ext['spring-batch.version'] = + // ext['spring-data-bom.version'] = + // ext['spring-framework.version'] = + // ext['spring-hateoas.version'] = + // ext['spring-integration.version'] = + // ext['spring-kafka.version'] = + // ext['spring-ldap.version'] = + // ext['spring-restdocs.version'] = + // ext['spring-retry.version'] = + // ext['spring-security.version'] = + // ext['spring-session-bom.version'] = + // ext['spring-ws.version'] = + // ext['sqlite-jdbc.version'] = + // ext['sun-mail.version'] = + // ext['thymeleaf.version'] = + // ext['thymeleaf-extras-data-attribute.version'] = + // ext['thymeleaf-extras-java8time.version'] = + // ext['thymeleaf-extras-springsecurity.version'] = + // ext['thymeleaf-layout-dialect.version'] = + // ext['tomcat.version'] = + // ext['unboundid-ldapsdk.version'] = + // ext['undertow.version'] = + // ext['versions-maven-plugin.version'] = + // ext['webjars-hal-browser.version'] = + // ext['webjars-locator-core.version'] = + // ext['wsdl4j.version'] = + // ext['xml-maven-plugin.version'] = + // ext['xmlunit2.version'] = +} diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..16f0ad3 --- /dev/null +++ b/build.gradle @@ -0,0 +1,835 @@ +apply from: "build-version.gradle" + +def isFrontendProject(currentDir){ + return file(currentDir.getAbsolutePath() + '/package.json').exists() && !file(currentDir.getAbsolutePath() + '/webpack.env.lib.cjs').exists(); +} + +/*********************************************************************** + * gradle 插件 + **********************************************************************/ +buildscript { + repositories { + maven { + allowInsecureProtocol = true + url "${repository_url}" + } + } + dependencies { + classpath "org.springframework.boot:org.springframework.boot.gradle.plugin:${spring_boot_version}" + classpath "io.sc:io.sc.platform.gradle:${platform_plugin_version}" + classpath "org.asciidoctor:asciidoctor-gradle-jvm:${asciidoctor_version}" + classpath "com.google.cloud.tools:jib-gradle-plugin:${jib_version}" + } +} + +/*********************************************************************** + * 所有项目(根项目及其子项目)都应用的插件 + **********************************************************************/ +allprojects { + apply plugin: 'idea' + apply plugin: 'io.sc.platform.gradle' +} + +/*********************************************************************** + * 所有子项目应用的插件 + **********************************************************************/ +subprojects { + apply plugin: 'java' + apply plugin: 'java-library' + apply plugin: 'eclipse' + apply plugin: 'maven-publish' + apply plugin: 'org.springframework.boot' + apply plugin: 'io.spring.dependency-management' + apply plugin: "org.asciidoctor.jvm.convert" + + configurations.all { + //设置 gradle 拉取依赖包的缓存策略为不进行缓存,可保证每次拉取最新的依赖包 + //resolutionStrategy.cacheDynamicVersionsFor 0, 'seconds' //动态版本: 1.1.+ + //resolutionStrategy.cacheChangingModulesFor 0, 'seconds' //静态版本: 1.1.2 + + //排除不需要的外部依赖 + exclude group: "org.apache.logging.log4j", module: "log4j-api" + exclude group: "org.apache.logging.log4j", module: "log4j-to-slf4j" + exclude group: "org.slf4j", module: "slf4j-jdk14" + exclude group: "org.slf4j", module: "slf4j-nop" + } + + dependencyManagement { + resolutionStrategy { + //设置 gradle 拉取依赖包的缓存策略为不进行缓存,可保证每次拉取最新的依赖包 + //cacheDynamicVersionsFor 0, 'seconds' //动态版本: 1.1.+ + //cacheChangingModulesFor 0, 'seconds' //静态版本: 1.1.2 + } + imports { + //mavenBom "org.springframework.cloud:spring-cloud-dependencies:${spring_cloud_version}" + mavenBom "com.alibaba.cloud:spring-cloud-alibaba-dependencies:${spring_cloud_alibaba_version}" + mavenBom "org.springframework.statemachine:spring-statemachine-bom:${spring_statemachine_version}" + } + } + + /*----------------------------------------------------------------- + * 配置构建时所需依赖的仓库 url + * 将仓库 url 都定位到 ${repository_url} 指定的本地私有仓库地址 + *----------------------------------------------------------------*/ + repositories { + all { ArtifactRepository repo -> + if(repo instanceof MavenArtifactRepository){ + def url = repo.url.toString() + if ( + url.startsWith('https://repo1.maven.org/maven2') + || url.startsWith('https://jcenter.bintray.com/') + || url.startsWith('https://maven.aliyun.com') + ) { + remove repo + } + } + } + maven { + allowInsecureProtocol = true + url "${repository_url}" + } + } + + /*----------------------------------------------------------------- + * java 编译时选项 + *----------------------------------------------------------------*/ + sourceCompatibility ="${java_version}" + targetCompatibility ="${java_version}" + compileJava.options.encoding ="${java_encoding}" + compileTestJava.options.encoding ="${java_encoding}" + + tasks.withType(JavaCompile) { + options.compilerArgs += ["-Xlint:deprecation","-Xlint:unchecked"] + } + + /*----------------------------------------------------------------- + * 配置项目基本信息 + *----------------------------------------------------------------*/ + group ="${application_group}" + version ="${application_version}" + + if(file('package.json').exists()){ + mkdir 'java-src/main/java'; + mkdir 'java-src/main/resources'; + mkdir 'dist'; + sourceSets.main.java.srcDir 'java-src/main/java' + sourceSets.main.resources.srcDir 'java-src/main/resources' + sourceSets.main.resources.srcDir 'dist' + } + + /*----------------------------------------------------------------- + * 源代码打包配置 + *----------------------------------------------------------------*/ + task sourcesJar (type : Jar) { + from sourceSets.main.allJava + archiveClassifier = 'sources' + } + + /*----------------------------------------------------------------- + * Java 文档打包配置 + *----------------------------------------------------------------*/ + javadoc { + options.encoding = 'UTF-8' + // 为了能够尽量规范 java doc 文档编写, 指定如果 java doc 中有错误,会报错,并且无法发布到仓库中 + failOnError=false + } + + task javadocJar (type: Jar) { + from javadoc + archiveClassifier = 'javadoc' + } + + clean { + delete 'dist' //删除前端自动生成的资源目录 + delete 'bin' //删除 eclipse 编译的 bin 目录 + delete 'build' //删除 gradle 构建目录 + } + + /*----------------------------------------------------------------- + * 配置 eclipse 插件 + *----------------------------------------------------------------*/ + eclipse{ + jdt{ + sourceCompatibility ="${java_version}" + targetCompatibility ="${java_version}" + } + } + + /*----------------------------------------------------------------- + * springboot 插件配置 + *----------------------------------------------------------------*/ + jar { + //可以生成普通的 jar + enabled = true + archiveClassifier.set("") + manifest { + attributes 'Manifest-Version' : '1.0', + 'Implementation-Title' : name, + 'Implementation-Vendor' : group, + 'Implementation-Version': archiveVersion + } + } + + /*----------------------------------------------------------------- + * asciidoctor 插件配置,用于生成 asciidoc 文档,用于打包到 jar 中 + *----------------------------------------------------------------*/ + asciidoctor { + baseDirFollowsSourceDir() + outputs.upToDateWhen { true } + + logDocuments = true + sourceDir = file('asciidoc') + sources { + include '*.adoc' + } + outputDir = file("dist/help/" + project.name) + resources { + from(sourceDir) { + include 'resources/**' + } + } + } + + asciidoctorj { + modules { + diagram.use() + } + } + + /*----------------------------------------------------------------- + * 自定义任务,用于生成 asciidoc 文档到 web 服务器,以便实时查看效果 + *----------------------------------------------------------------*/ + task doc(type: org.asciidoctor.gradle.jvm.AsciidoctorTask){ + baseDirFollowsSourceDir() + outputs.upToDateWhen { true } + + logDocuments = true + sourceDir = file('asciidoc') + sources { + include '*.adoc' + } + outputDir = file("$asciidoc_deploy_dir" + project.name) + + // 拷贝 asciidoc 自定义资源 + // 设置方式: 通过命令行 -D 传入目标环境参数 + // gradle doc -DdocResource=true # 需要拷贝自定义资源 + // gradle doc -DdocResource=false # 不需要拷贝自定义资源 + def docResource =System.getProperty("docResource")?:"true"; + if(docResource=="true"){ + resources { + from(sourceDir) { + include 'resources/**' + } + } + } + } + + /*----------------------------------------------------------------- + * 资源处理前执行 asciidoctor + *----------------------------------------------------------------*/ + processResources { + dependsOn asciidoctor + doLast{ + //打包时移除 jrebel 相关的文件 + delete "$buildDir/resources/main/rebel.xml" + } + } + + /*----------------------------------------------------------------- + * 用于自动生成 jrebel.xml 文件的自定义任务(eclipse) + *----------------------------------------------------------------*/ + task jrebelEclipse() {} + tasks.jrebelEclipse.doLast { + File resourcesFile =file('src/main/resources') + if(resourcesFile!=null && resourcesFile.exists()){ + File rebelFile = file('src/main/resources/rebel.xml') + rebelFile.withWriter('UTF-8') { writer -> + writer.write('\n'); + writer.write('\n'); + writer.write('\t\n'); + if(file(project.name + '/src/main').exists()){ + writer.write('\t\t\n'); + } + if(file(project.name + '/src/generated').exists()){ + writer.write('\t\t\n'); + } + writer.write('\t\n'); + writer.write(''); + } + } + } + + /*----------------------------------------------------------------- + * 用于自动生成 jrebel.xml 文件的自定义任务(idea) + *----------------------------------------------------------------*/ + task jrebelIdea() {} + tasks.jrebelIdea.doLast { + if(isFrontendProject(file('.'))) { + File resourcesFile = file('java-src/main/resources') + if (resourcesFile != null && resourcesFile.exists()) { + File rebelFile = file('java-src/main/resources/rebel.xml') + rebelFile.withWriter('UTF-8') { writer -> + writer.write('\n'); + writer.write('\n'); + writer.write('\t\n'); + if (file(project.name + '/java-src/main').exists()) { + writer.write('\t\t\n'); + } + writer.write('\t\n'); + writer.write(''); + } + } + }else { + File resourcesFile = file('src/main/resources') + if (resourcesFile != null && resourcesFile.exists()) { + File rebelFile = file('src/main/resources/rebel.xml') + rebelFile.withWriter('UTF-8') { writer -> + writer.write('\n'); + writer.write('\n'); + writer.write('\t\n'); + if (file(project.name + '/src/main').exists()) { + writer.write('\t\t\n'); + } + writer.write('\t\n'); + writer.write(''); + } + } + } + } + + /*----------------------------------------------------------------- + * maven publish 插件配置 + *----------------------------------------------------------------*/ + publishing { + repositories { + maven { + allowInsecureProtocol = true //允许采用 http 协议发布 + url = version.contains('SNAPSHOT') ? "${repository_snapshot_url}" : "${repository_release_url}" + credentials { + username = (version.contains('SNAPSHOT') ? "${repository_snapshot_username}" : "${repository_release_username}") + password = (version.contains('SNAPSHOT') ? "${repository_snapshot_password}" : "${repository_release_password}") + } + } + } + publications{ + publication(MavenPublication){ + from components.java + //artifact sourcesJar + //artifact javadocJar + versionMapping { + usage('java-api') { + fromResolutionOf('runtimeClasspath') + } + usage('java-runtime') { + fromResolutionResult() + } + } + } + } + } + + /*----------------------------------------------------------------- + * 更新前端模块的 package.json 文件,同步其中的 name 和 version + *----------------------------------------------------------------*/ + task frontendUpdatePackageJson(){} + tasks.frontendUpdatePackageJson.doFirst { + if(isFrontendProject(file('.'))) { + println '开始执行 frontendUpdatePackageJson ......' + } + } + tasks.frontendUpdatePackageJson.doLast { + if(isFrontendProject(file('.'))){ + String content =file('package.json').text; + def packageJson = new groovy.json.JsonSlurper().parseText(content); + if(packageJson!=null){ + println packageJson.dependencies; + packageJson.name =project.name; + packageJson.version =project.version; + packageJson.dependencies['platform-core']=platform_core_frontend_version; + def json = groovy.json.JsonOutput.toJson(packageJson); + file('package.json').withWriter('UTF-8') { writer -> + writer.write(groovy.json.JsonOutput.prettyPrint(json)); + } + } + } + } + + /*----------------------------------------------------------------- + * pnpm install + *----------------------------------------------------------------*/ + task frontendNpmInstall(type:Exec){ + if(isFrontendProject(file('.'))){ + workingDir '.' + if(org.gradle.internal.os.OperatingSystem.current().isWindows()){ + commandLine 'cmd', '/c', 'pnpm', 'install' + }else{ + commandLine 'pnpm', 'install' + } + }else{ + if(org.gradle.internal.os.OperatingSystem.current().isWindows()){ + commandLine 'cmd', '/c', 'cd', '.' + }else{ + commandLine 'cd', '.' + } + } + } + tasks.frontendNpmInstall.doFirst { + if(isFrontendProject(file('.'))) { + println '开始执行 pnpm install ......'; + } + } + + /*----------------------------------------------------------------- + * pnpm sync + *----------------------------------------------------------------*/ + task frontendNpmSync(type:Exec){ + if(isFrontendProject(file('.')) && !project.name.contains("io.sc.platform.security.frontend")){ + workingDir '.' + if(org.gradle.internal.os.OperatingSystem.current().isWindows()){ + commandLine 'cmd', '/c', 'pnpm', 'sync' + }else{ + commandLine 'pnpm', 'sync' + } + }else{ + if(org.gradle.internal.os.OperatingSystem.current().isWindows()){ + commandLine 'cmd', '/c', 'cd', '.' + }else{ + commandLine 'cd', '.' + } + } + } + tasks.frontendNpmSync.doFirst { + if(isFrontendProject(file('.'))) { + println '开始执行 pnpm sync ......'; + } + } + + /*----------------------------------------------------------------- + * pnpm run build + *----------------------------------------------------------------*/ + task frontendNpmBuild(type:Exec) { + if(isFrontendProject(file('.'))){ + workingDir '.' + if(org.gradle.internal.os.OperatingSystem.current().isWindows()){ + commandLine 'cmd', '/c', 'pnpm', 'run', 'build' + }else{ + commandLine 'pnpm', 'run', 'build' + } + }else{ + if(org.gradle.internal.os.OperatingSystem.current().isWindows()){ + commandLine 'cmd', '/c', 'cd', '.' + }else{ + commandLine 'cd', '.' + } + } + } + tasks.frontendNpmBuild.doFirst { + if (isFrontendProject(file('.'))) { + println '开始执行 pnpm run build ......' + } + } + + /*----------------------------------------------------------------- + * pnpm run prod + *----------------------------------------------------------------*/ + task frontendNpmProd(type:Exec) { + if(isFrontendProject(file('.'))){ + workingDir '.' + if(org.gradle.internal.os.OperatingSystem.current().isWindows()){ + commandLine 'cmd', '/c', 'pnpm', 'run', 'prod' + }else{ + commandLine 'pnpm', 'run', 'prod' + } + }else{ + if(org.gradle.internal.os.OperatingSystem.current().isWindows()){ + commandLine 'cmd', '/c', 'cd', '.' + }else{ + commandLine 'cd', '.' + } + } + } + tasks.frontendNpmProd.doFirst { + if(isFrontendProject(file('.'))){ + println '开始执行 pnpm run prod ......' + } + } + + /*----------------------------------------------------------------- + * 将入口前端 dist/public/模块名 目录下 index.html 文件复制到 classpath:/templates/模块名.html + * 提供给 thymeleaf 作为视图模板使用 + *----------------------------------------------------------------*/ + task frontendGenerateThymeleafTemplate {} + tasks.frontendGenerateThymeleafTemplate.doFirst { + if(isFrontendProject(file('.'))) { + println '开始执行 frontendGenerateThymeleafTemplate ......' + delete "java-src/main/resources/templates" + mkdir "java-src/main/resources/templates" + } + } + tasks.frontendGenerateThymeleafTemplate.doLast { + if(isFrontendProject(file('.'))) { + def content = file("dist/public/${project.name}/index.html").text; + content = content.replace('