简化基于Maven的Scala项目创建详解

news2024/11/19 11:22:14

使用 Maven 来构建 Scala 项目方便虽然方便,但依赖于每一个开发人员都去配置一遍项目的必要依赖,包括 Scala 插件的编译配置以及 Scala 的依赖类库,让每个人通过拷贝(Copy)之前的项目配置当然可以,但难免会出些纰漏。

而从头开始所有相关配置项都配置一遍,又略显繁琐,那么,我们可不可以想办法来进一步简化类似的基于 Maven 的 Scala 项目创建和配置?

使用代码片段管理工具

实际上,我们通常都会有收集的嗜好,尤其是作为一名软件开发者,都会有一套自己的代码片段管理工具或者套路,将一些常用的或者自己感觉经典的代码片段及配置内容进行摘录并保存。

现在有很多不错的代码片段管理工具,比如 Mac 系统上的 Dash(https://kapeli.com/dash),它可以帮助我们一站式索引技术文档并管理代码片段,有了像 Dash 这样的工具,我们就可以将基于 Maven 的 Scala 项目配置文件整理成一个代码片段(Snippet)进行管理。

然后在使用的时候直接在 Maven 的 pom.xml 中输入该代码片段的标志信息,mvn.scala.cfg`Dash 将会自动将我们配置的代码片段的内容展开并替换现有 pom.xml 的内容。

这种方法简单、快速、模板化、可重复,但只适合单一开发人员,如果一个团队或者组织内部所有人都使用这种方式,代码片段的内容同步,以及 Dash 等软件的授权等都是随之衍生出来需要进一步解决的问题。所以,为了能够使更大层面的开发者收益,我们需要寻找更加有效的方法。

创建 spring-boot-starter-scala 简化 Scala 依赖配置

对于基于 Maven 的 Scala 项目来说,以下依赖是必不可少的:

  1. <dependency>
  2. <groupId>org.scala-lang</groupId>
  3. <artifactId>scala-library</artifactId>
  4. <version>${scala.version}</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.scala-lang</groupId>
  8. <artifactId>scala-compiler</artifactId>
  9. <version>${scala.version}</version>
  10. </dependency>

那么,我们可以先从这里进行简化,为了避免所有人都重复配置这部分依赖内容,可以构建一个 spring-boot-starter-scala 自动配置模块,这样,所有开发者只要在自己的项目中依赖这一个 spring-boot-starter-scala 自动配置模块就可以了。

我们依然可以通过 http://start.spring.io 脚手架服务创建 spring-boot-starter-scala 项目,然后将最终的 pom.xml 配置如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.keevol.springboot</groupId>
  6. <artifactId>spring-boot-starter-scala</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <name>spring-boot-starter-scala</name>
  10. <url>http://maven.apache.org</url>
  11. <properties>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <java.version>1.8</java.version>
  14. <scala.version>2.11.7</scala.version>
  15. <scala.maven.version>3.2.2</scala.maven.version>
  16. </properties>
  17. <build>
  18. <plugins>
  19. <plugin>
  20. <groupId>net.alchim31.maven</groupId>
  21. <artifactId>scala-maven-plugin</artifactId>
  22. <version>${scala.maven.version}</version>
  23. <executions>
  24. <execution>
  25. <id>compile-scala</id>
  26. <phase>compile</phase>
  27. <goals>
  28. <goal>add-source</goal>
  29. <goal>compile</goal>
  30. </goals>
  31. </execution>
  32. <execution>
  33. <id>test-compile-scala</id>
  34. <phase>test-compile</phase>
  35. <goals>
  36. <goal>add-source</goal>
  37. <goal>testCompile</goal>
  38. </goals>
  39. </execution>
  40. </executions>
  41. <configuration>
  42. <recompileMode>incremental</recompileMode>
  43. <scalaVersion>${scala.version}</scalaVersion>
  44. <args>
  45. <arg>-deprecation</arg>
  46. </args>
  47. <jvmArgs>
  48. <jvmArg>-Xms64m</jvmArg>
  49. <jvmArg>-Xmx1024m</jvmArg>
  50. </jvmArgs>
  51. </configuration>
  52. </plugin>
  53. </plugins>
  54. </build>
  55. <dependencies>
  56. <dependency>
  57. <groupId>org.scala-lang</groupId>
  58. <artifactId>scala-library</artifactId>
  59. <version>${scala.version}</version>
  60. </dependency>
  61. <dependency>
  62. <groupId>org.scala-lang</groupId>
  63. <artifactId>scala-compiler</artifactId>
  64. <version>${scala.version}</version>
  65. </dependency>
  66. </dependencies>
  67. </project>

然后通过 mvn install 或者 mvn deploy 将其发布。

现在,创建任何一个基于 Maven 的 Scala 项目时,pom.xml 配置内容就可以简化如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.keevol.springboot</groupId>
  6. <artifactId>spring-boot-starter-scala-user</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <name>spring-boot-starter-scala-user</name>
  10. <url>http://maven.apache.org</url>
  11. <dependencies>
  12. <dependency>
  13. <groupId>com.keevol.springboot</groupId>
  14. <artifactId>spring-boot-starter-scala</artifactId>
  15. <version>1.0-SNAPSHOT</version>
  16. </dependency>
  17. </dependencies>
  18. </project>

是不是更加简洁和方便了?但是,等一下,如果大家都这样认为,那就有问题了。

实际上,这样的做法是行不通的,Maven 项目的依赖可以传递依赖(Transitive dependency),但是插件(Plugin)却不行。如果我们真得在前面的项目配置上进行工作的话,spring-boot-starter-scala-user 可以编译成功,可以打包成功,可以发布成功,但是,在整个过程中 Maven 无法识别 Scala 代码。

所以,如果要让基于 spring-boot-starter-scala 的想法可以实现,我们需要将 scala-maven-plugin 从 spring-boot-starter-scala 项目中移到 spring-boot-starter-scala-user 项目。

spring-boot-starter-scala 项目的配置现如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.keevol.springboot</groupId>
  6. <artifactId>spring-boot-starter-scala</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <name>spring-boot-starter-scala</name>
  10. <url>http://maven.apache.org</url>
  11. <properties>
  12. <scala.version>2.11.7</scala.version>
  13. </properties>
  14. <dependencies>
  15. <dependency>
  16. <groupId>org.scala-lang</groupId>
  17. <artifactId>scala-library</artifactId>
  18. <version>${scala.version}</version>
  19. </dependency>
  20. <dependency>
  21. <groupId>org.scala-lang</groupId>
  22. <artifactId>scala-compiler</artifactId>
  23. <version>${scala.version}</version>
  24. </dependency>
  25. </dependencies>
  26. </project>

spring-boot-starter-scala-user 的项目配置则如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.keevol.springboot</groupId>
  6. <artifactId>spring-boot-starter-scala-user</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <name>spring-boot-starter-scala-user</name>
  10. <url>http://maven.apache.org</url>
  11. <properties>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <java.version>1.8</java.version>
  14. <scala.version>2.11.7</scala.version>
  15. <scala.maven.version>3.2.2</scala.maven.version>
  16. </properties>
  17. <build>
  18. <plugins>
  19. <plugin>
  20. <groupId>net.alchim31.maven</groupId>
  21. <artifactId>scala-maven-plugin</artifactId>
  22. <version>${scala.maven.version}</version>
  23. <executions>
  24. <execution>
  25. <id>compile-scala</id>
  26. <phase>compile</phase>
  27. <goals>
  28. <goal>add-source</goal>
  29. <goal>compile</goal>
  30. </goals>
  31. </execution>
  32. <execution>
  33. <id>test-compile-scala</id>
  34. <phase>test-compile</phase>
  35. <goals>
  36. <goal>add-source</goal>
  37. <goal>testCompile</goal>
  38. </goals>
  39. </execution>
  40. </executions>
  41. <configuration>
  42. <recompileMode>incremental</recompileMode>
  43. <scalaVersion>${scala.version}</scalaVersion>
  44. <args>
  45. <arg>-deprecation</arg>
  46. </args>
  47. <jvmArgs>
  48. <jvmArg>-Xms64m</jvmArg>
  49. <jvmArg>-Xmx1024m</jvmArg>
  50. </jvmArgs>
  51. </configuration>
  52. </plugin>
  53. </plugins>
  54. </build>
  55. <dependencies>
  56. <dependency>
  57. <groupId>com.keevol.springboot</groupId>
  58. <artifactId>spring-boot-starter-scala</artifactId>
  59. <version>1.0-SNAPSHOT</version>
  60. </dependency>
  61. </dependencies>
  62. </project>

现在看来,spring-boot-starter-scala 只是帮助我们简化了依赖管理,但对于 Scala 编译插件相关的简化则于事无补,像 spring-boot-starter-scala-user 这样的一大批基于 Maven 的 Scala 项目还是要一遍一遍地配置 Scala 编译插件相关内容。

不过,如果我们暂时能够忍受每个项目自己配置 Scala 编译插件的话(个人、小团队一般可以甚至也愿意),可以先进一步简化依赖 spring-boot-starter-scala 项目的 SpringBoot 微服务项目的创建。

我们经常用的 http://start.spring.io 它罗列了很多现有的 spring-boot-starter 自动配置模块供我们在创建 SpringBoot 项目的时候使用,如图 1 所示。


图 1 SPRING INITIALIZR自动配置模块可用列表示意图

 

如果将我们的 spring-boot-starter-scala 也加入进去,大家在创建项目的时候就可以不用配置 pom.xml 吗?

部署在 http://start.spring.io 的 SPRING INITIALIZR 项目服务实例我们是无权变更的,不过,我们可以在自己的公司或者组织内部搭建一个私有的 SPRING INITIALIZR 服务实例。

教程前面也跟大家提到过,只要到 https://github.com/spring-io/initializr 获取项目然后部署到自己的服务,然后根据 https://github.com/spring-io/initializr#running-your-own-instance 的说明启动服务即可。

要将我们的 spring-boot-starter-scala 加入 SPRING INITIALIZR 的自动配置模块选择列表,需要先对自有的 SPRING INITIALIZR 实例进行一定的配置。

使用任何自己喜欢的文本编辑器打开 application.yml 配置文件(位于 {SPRING INITIALIZR 根目录}/initializr-service/),然后在 dependencies 部分的末尾添加如下配置内容:

  1. dependencies:
  2. - name: Core content:
  3. - name: Security id: security
  4. description: Secure your application via
  5. spring-security weight: 100
  6. -name: AOP id: aop description: Aspect-oriented programming including
  7. spring-aop and AspectJ ...
  8. - name: Ops content:
  9. - name: Actuator id:
  10. actuator description: Production ready features to
  11. help you monitor and
  12. manage your application ...
  13. - name: Scala content:
  14. - name: Scala id: scala
  15. description: API documentation for the Actuator
  16. endpoints repository:
  17. local-repo groupId: com.wacai.springboot
  18. artifactId:
  19. spring-boot-starter-scala version: 0.0.1-SNAPSHOT

我们添加了一个名为 Scala 的展示配置区块,然后将 spring-boot-starter-scala 作为配置内容配置其中。

但这还不够,我们还需要告诉 SPRING INITIALIZR,当用户选择了 spring-boot-starter-scala 之后,在生成项目时,需要到哪里获取这个依赖,既然我们明确指定了 repository:local-repo,那么,就要配置一下这个名字为 local-repo 的仓库,让 SPRING INITIALIZR 知道这个 local-repo。

在 application.yml 配置文件中的 initializr->env 部分添加一个 repositories 相关配置如下:

  1. initializr: env: boms: vaadin-bom: groupId: com.vaadin artifactId: vaadin-bom
  2. version: 7.5.5 cloud-bom: groupId: org.springframework.cloud ...
  3. repositories: local-repo: name: local-maven-repo
  4. url: file:///Users/fujohnwang/.m2 snapshotsEnabled: true

我们添加了 local-repo 指向笔者工作机本地的 maven 仓库地址,大家也可以将自己公司或者组织内部私有 maven 仓库也添加进来。

实际上,在配置 dependenies 的时候,并不一定要配置 repository:local-repo,这里纯粹是为了让大家了解这部分配置的更多信息。

关于 SPRING INITIALIZR 的更多配置详细说明,可以参考 https://github.com/spring-io/initializr/wiki/Configuration-format。

以上所有配置完备后,直接在 {SPRING INITIALIZR根目录}/initializr-service/ 下执行 spring run app.groovy 并最终启动 SPRING INITIALIZR,现在,访问 SPRING INITIALIZR 的服务地址就可以看到我们的最终成果了。

只要选择并单击生成项目之后,最终获得的项目配置中就已经自动获得了 spring-boot-starter-scala 的配置,配置代码如下所示。

  1. <dependency>
  2. <groupId>com.wacai.springboot</groupId>
  3. <artifactId>spring-boot-starter-scala</artifactId>
  4. <version>0.0.1-SNAPSHOT</version>
  5. </dependency>

关于基于 Maven 的 Scala 项目的依赖治理以及 spring-boot-starter-scala,我们暂时就介绍到这里。虽然我们在依赖治理和工具的覆盖度、易用度层面做出了很好的探索,但依然没有简化 Scala 编译插件配置的繁琐操作,大家还需要继续努力。

创建公司和组织级别的 Scala 项目的 parent pom

目前为止,Scala 相关的依赖管理已经比较令人满意了,现在,我们只要主攻如何简化 Scala 编译插件配置的简化就可以了。

好消息就是,Maven 的插件(Plugins)虽然不能通过组合的方式重用,但可以通过继承的方式搞定,所以,我们可以构建一个公司或者组织级别 Maven 项目的 parent pom 专门用于基于 Maven 的 Scala 项目。

下面是我们的示例项目,只有一个 pom.xml 定义:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>1.3.2.RELEASE</version>
  9. <relativePath />
  10. </parent>
  11. <groupId>com.keevol.maven</groupId>
  12. <artifactId>scala-parent</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <packaging>pom</packaging>
  15. <name>scala-parent</name>
  16. <url>http://maven.apache.org</url>
  17. <properties>
  18. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  19. <java.version>1.8</java.version>
  20. <scala.version>2.11.7</scala.version>
  21. <scala.maven.version>3.2.2</scala.maven.version>
  22. </properties>
  23. <build>
  24. <plugins>
  25. <plugin>
  26. <groupId>net.alchim31.maven</groupId>
  27. <artifactId>scala-maven-plugin</artifactId>
  28. <version>${scala.maven.version}</version>
  29. <executions>
  30. <execution>
  31. <id>compile-scala</id>
  32. <phase>compile</phase>
  33. <goals>
  34. <goal>add-source</goal>
  35. <goal>compile</goal>
  36. </goals>
  37. </execution>
  38. <execution>
  39. <id>test-compile-scala</id>
  40. <phase>test-compile</phase>
  41. <goals>
  42. <goal>add-source</goal>
  43. <goal>testCompile</goal>
  44. </goals>
  45. </execution>
  46. </executions>
  47. <configuration>
  48. <recompileMode>incremental</recompileMode>
  49. <scalaVersion>${scala.version}</scalaVersion>
  50. <args>
  51. <arg>-deprecation</arg>
  52. </args>
  53. <jvmArgs>
  54. <jvmArg>-Xms64m</jvmArg>
  55. <jvmArg>-Xmx1024m</jvmArg>
  56. </jvmArgs>
  57. </configuration>
  58. </plugin>
  59. </plugins>
  60. </build>
  61. <dependencies>
  62. <dependency>
  63. <groupId>org.scala-lang</groupId>
  64. <artifactId>scala-library</artifactId>
  65. <version>${scala.version}</version>
  66. </dependency>
  67. <dependency>
  68. <groupId>org.scala-lang</groupId>
  69. <artifactId>scala-compiler</artifactId>
  70. <version>${scala.version}</version>
  71. </dependency>
  72. </dependencies>
  73. </project>

这个用作父项目(parent)的 maven 项目,其 pom.xml 的定义中将 Scala 编译插件(scala-maven-plugin)的配置以及 Scala 相关类库的依赖配置都囊括在内,这样,所有继承了这个父项目的子项目就都可以直接享受这些配置,而不用自己再去一一进行配置了,比如:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>com.keevol.maven</groupId>
  7. <artifactId>scala-parent</artifactId>
  8. <version>0.0.1-SNAPSHOT</version>
  9. </parent>
  10. <groupId>com.keevol.maven</groupId>
  11. <artifactId>scala-parent-user</artifactId>
  12. <version>1.0-SNAPSHOT</version>
  13. <packaging>jar</packaging>
  14. <name>scala-parent-user</name>
  15. <url>http://maven.apache.org</url>
  16. <properties>
  17. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>junit</groupId>
  22. <artifactId>junit</artifactId>
  23. <version>3.8.1</version>
  24. <scope>test</scope>
  25. </dependency>
  26. </dependencies>
  27. </project>

父项目的 packaging 类型为 pom,而不是一般的 jar 或者 war 等。

使用 Maven Archetype 简化项目创建

不管是使用什么语言开发,创建项目都是一个永恒的主题,作为一线的开发工程师和领导者们往往也会为团队内部创建项目的千差万别而头疼,所以,脚手架(Scaffording)工具就成了研发体系中必要的一员。

如果我们紧盯和继续挖掘 Maven 的潜力,除了使用前面提到的那些方法,Maven 的 Archetype 功能也是一种可以帮助我们简化 Scala 项目创建的方案。

我们可以遵循 Maven 的 Archetype 规范创建一个 Scala 的模板项目(其实就是一个脚手架项目),然后将所有 Scala 项目相关的配置以及代码等都放到这个模板项目中,当每个开发者希望创建一个 Scala 项目时,只要使用这个 Scala 的 Archetype 项目创建一个模板项目出来就可以直接开发了。

创建 Maven Archetype 项目有两种方式:

  • 根据 Maven Archetype 项目规范从零开始创建项目。
  • 在一个现有的项目的基础上创建 Maven Archetype 项目。

鉴于我们已经有了好几个可以作为规范或者“模范”使用的 Maven 的 Scala 项目,从零开始创建一个 Archetype 就没有必要了,我们选择第二种方式,即在现有项目的基础上创建我们的 Maven Archetype 项目。

我们选择 currency-webapi-with-scala 项目作为模板项目用来创建 Archetype,然后再在生成的 Archetype 项目的基础上进行裁剪,最终获得一个理想的 Archetype。

首先,到 currency-webapi-with-scala 项目下执行 mvn archetype:create-from-project 命令,这将在项目的 target/generated-sources/archetype/ 目录下生成一个“草稿”版的 Archetype 项目,我们将在这个“草稿”版的 Archetype 项目基础上进行一定的裁剪。

我们可以对项目根目录下的 pom.xml 中的必要信息进行修改,比如 groupId、artifactId、developers 等,这些都是将来我们引用这个 Archeteype 项目创建项目时所关心的信息。但使用 Archetype 项目创建出来的 Maven 项目会有哪些内容,则是由 Archetype 项目 src 下的内容决定的。

src/main/resources/archetype-resources 目录下的内容大体上认为就是生成目标项目的时候,生成的目标项目会拥有的东西,没做裁剪之前,这些内容都是根据 currency-webapi-with-scala 的内容“拷贝(Copy)”过来的,我们会对这个符合 Maven 项目结构目录下的内容进行裁剪。

比如删除 currency-webapi.iml 等 IDE 相关元信息文件,添加 .gitignore 等必要元信息文件等。src/main/resources/META-INF/maven/archetype-metadata.xml 文件是进一步细化裁剪规则的配置文件。

以上裁剪完成后,我们执行如下命令完成最终的 Archetype 项目的发布:

$ cd target/generated-sources/archetype/ $ mvn install 或者 mvn deploy 现在,要创建一个基于 Maven 的 Scala 项目,我们只要执行如下命令即可:

  1. mvn archetype:generate -DarchetypeGroupId=com.mengma.springboot-DarchetypeArtifactId=currency-webapi-with-scala-archetype-DarchetypeVersion=0.0.1-SNAPSHOT-DgroupId=com.keevol.springboot-DartifactId=new-scala-project-name-Dversion=0.0.1-SNAPSHOT

以上命令执行完成后,在当前目录下会创建一个 new-scala-project-name 的目录,这就是一个完整的符合我们之前裁剪设定的基于 Maven 的 Scala 项目。

现在,团队或者公司内任何一个开发者想要创建一个基于 Maven 的 Scala 项目,只要执行以上类似的一条 mvn archetype:generate 命令就可以了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/72294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二叉树与递归

前言 二叉树与递归 文章目录前言一、第一种方法1、如何思考二叉树相关的问题&#xff1f;1&#xff09;最大深度的定义2&#xff09;由具体到一般3&#xff09;公式4&#xff09;总结2、为什么需要使用递归&#xff1f;1&#xff09;循环和递归2&#xff09;递和归的过程3、为什…

GitHub上传文件和文件夹以及大于25M的单个文件

有好几个地方直接拖拽上传即可&#xff08;其中之一见下图&#xff09;&#xff0c;不管是文件还是文件夹目录结构不会变的。一次可上传的文件夹要求其内部的文件个数不超过100个&#xff0c;否则先GitHub上新建文件夹&#xff08;空文件的嘎货&#xff09;然后文件分批上传到G…

使用Python谋生的10种方法

这里本文的目录前言在质量保证部&#xff08;QA&#xff09;工作成为小型组织的IT员工为应用程序执行专业脚本管理网络教编程技能帮助人们决定位置执行数据挖掘与嵌入式系统互动开展科学任务进行数据实时分析零基础Python学习资源介绍&#x1f449;Python学习路线汇总&#x1f…

小程序ScrollView置顶只会成功一次,小程序如何做一键置顶?

现在会出现的问题就是点击置顶只会成功触发一次触顶 问题录像 置顶出现的问题为什么会出现这个问题呢&#xff1f; 先看看怎么控制scrollView实现置顶的。 scroll-top number/string 否 设置竖向滚动条位置scroll-view官网地址 通过动态的设置scroll-top来控制滚动条的位置…

Python编码问题整理

GB2312是中国规定的汉字编码&#xff0c;也可以说是简体中文的字符集编码 GBK 是 GB2312的扩展 ,除了兼容GB2312外&#xff0c;它还能显示繁体中文&#xff0c;还有日文的假名 cp936&#xff1a;中文本地系统是Windows中的cmd&#xff0c;默认codepage是CP936&#xff0c;cp936…

three.js之光源

文章目录简介分类环境光点光源平行光聚光灯光源辅助对象相关计算颜色计算阴影相关属性castShadowreceiveShadowshadowLightShadow基类专栏目录请点击 简介 光源是对于自然界光照的模拟&#xff0c;往往为了更好的渲染场景&#xff0c;需要设置不同的光源&#xff0c;设置不同的…

如何利用Python中的scipy做卡方检验?

1.简单介绍 卡方检验是一种用途很广的计数资料的假设检验方法。它属于非参数检验的范畴&#xff0c;主要是比较两个及两个以上样本率&#xff08;构成比&#xff09;以及两个分类变量的关联性分析。其根本思想就是在于比较理论频数和实际频数的吻合程度或拟合优度问题。 应用场…

【数据架构】如何通俗易懂的介绍数据模型

一直以来&#xff0c;如何和业务领导讲明白什么是数据模型&#xff0c;是沟通的一大难题&#xff0c;下面演示一个示例&#xff0c;仅供参考。 介绍抽象世界 先从大佬胡本立的《以人为中心的数据观》说起。这个世界可以划分为3个世界&#xff0c;一个是客观存在的客观世界&am…

Lecture3:神经网络与反向传播

目录 1.计算图 2.反向传播与计算图 2.1 第一个例子 2.2 第二个例子--sigmoid 2.3 第三个例子--MAX门 2.4 第四和例子--对于向量的梯度 3.神经网络 4.常见矩阵求导公式 4.1 标量对向量求导 4.2 二次型对向量求导 1.计算图 在实践中我们想要推导和使用解析梯度&…

SOLIDWORKS PDM 2023新功能 SOLIDWORKS本地数据管理优化升级

SOLIDWORKS 2023新版本已经与大家见面&#xff0c;今天众联亿诚与大家分享SOLIDWORKS PDM 2023新功能&#xff0c;让我们先一起来看看视频—— 点击观看SOLIDWORKS PDM 2023新功能 长期以来&#xff0c;SOLIDWORKS PDM Professional一直为SOLIDWORKS的本地数据管理制定标准。随…

centos8 离线安装redis的艰苦历程(gcc、make、redis)

目录 背景环境 一、安装gcc 二、安装make 三、安装redis 背景环境 服务器centos8&#xff0c;内网不能联网 本机Windows&#xff0c;能联网 一、安装gcc 1、下载rpm文件 比较恶心的是需要手动的搜索一个一个的下载。不要问我为什么知道的&#xff01;&#xff01;&…

C++11特性-模板的改进

1.模板的右尖括号>> C11模板的多个右尖括号需要一个空格符fun<A<> >,之前连在一起是右移操作符 C11特性优化了这个fun<A<>> 2.模板的默认参数 函数模板能添加模板参数 template <typename T int> 类模板参数多个时&#xff0c;必…

opencv c++ 光流法、稀疏光流法、稠密光流法、均值迁移追踪(meanshift、camshift)

1、概念 参考&#xff1a; (70条消息) 什么是光流法_张年糕慢慢走的博客-CSDN博客_光流法 (70条消息) 计算机视觉--光流法(optical flow)简介_T-Jhon的博客-CSDN博客_光流法 此外&#xff0c;还有基于均值迁移的目标追踪方法&#xff1a; camshift&#xff1a; (75条消息)…

【VC7升级VC8】将vCenter Server 7.X 升级为 vCenter Server 8 (上)—— VC 8系统要求与升级前的说明

目录1. 新 vCenter Server Appliance 8的系统要求1.1 确认升级路径1.2 硬件要求1.3 存储要求1.4 软件要求1.5 vSphere Client 软件要求2. 升级说明2.1 升级阶段介绍2.2 旧VC7虚拟机的信息2.3 打开升级用安装程序&#xff08;1&#xff09;进入vcsa镜像目录&#xff08;2&#x…

leetcode(力扣)算法刷题-160. 相交链表

描述&#xff1a; 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据保证整个链式结构中不存在环。 注意&#xff0c…

Java基础入门第三版黑马课后习题(编程部分)

第 1 章 Java 开发入门 第 2 章 Java 编程基础 1. 编写程序,计算13…99的值,要求如下&#xff1a; (1)使用循环语句实现1~99的遍历 (2)在遍历过程中,通过条件判断当前的数是否为奇数,如果是就累加,否则不加。 public class getSum { 2 public static void main(String[] ar…

vue elementui 多选级联组件 全选功能

Vue 封装 多选级联组件 支持全选功能 使用方式和elm官方一致&#xff0c;原参数一致主要参数&#xff1a; options&#xff1a;级联数菜单。多维数组mulSelectedVal&#xff1a;绑定值。id集合。且取值最后一层idcollapseTags&#xff1a;是否tag展示fieldNames&#xff1a;自…

酵母葡聚糖硫酸酯(SPS)|葡聚糖修饰异黄酮|右旋糖酐修饰Savinase蛋白酶

酵母葡聚糖硫酸酯(SPS)|葡聚糖修饰异黄酮|右旋糖酐修饰Savinase蛋白酶 酵母葡聚糖硫酸酯(SPS) 中文名称&#xff1a;酵母葡聚糖硫酸酯(SPS) 纯度&#xff1a;95% 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 外观:固体或粘性液体 包装&#xff1a;瓶装/袋…

C++ 函数重载的细节

前言&#xff1a;如果不想看论证&#xff0c;可以直接点击总结&#xff0c;跳转到最后 目录 总结 1、使用重载函数时&#xff0c;如果数据类型不匹配&#xff0c;C尝试使用类型转换与形参进行匹配&#xff0c;如果转换后有多个函数能匹配上&#xff0c;编译器将报错&#xff1…

【重识云原生】第六章容器基础6.4.12节——IPv4与IPv6双协议栈配置

1 IPv4/IPv6 双协议栈特性 Kubernetes v1.23 [stable] IPv4/IPv6 双协议栈网络能够将 IPv4 和 IPv6 地址分配给 Pod 和 Service。 从 1.21 版本开始&#xff0c;Kubernetes 集群默认启用 IPv4/IPv6 双协议栈网络&#xff0c; 以支持同时分配 IPv4 和 IPv6 地址。 1.1 支持的…