原创java开源项目发布maven全球中央仓库详细过程示范和遇到的问题解决办法

文章目录

  • java项目上传到maven全球中央仓库(原创个人开源项目发布maven中央仓库详细过程示范)
    • 需求背景
    • 第一步 注册sonatype账号
    • 第二步 登录sonatype账号并申请新建项目
    • 第三步 准备个人GPG数字签名并发布到ubuntu
    • 第四步 准备maven配置
    • 第五步 修改项目配置
    • 第七步 发布项目
    • 第八步 nexus仓库查看打包好的
    • 遇到过的问题

java项目上传到maven全球中央仓库(原创个人开源项目发布maven中央仓库详细过程示范)

需求背景

最近工作里写的一个缓存框架挺好用的,准备把这个缓存写成开源项目,于是将缓存相关代码脱敏提取创建新项目并开源在github LocalCache开源项目

打包好的依赖项

<dependency>
  <groupId>cn.humorchen</groupId>
  <artifactId>LocalCache</artifactId>
  <version>1.0.0-RELEASE</version>
</dependency>

第一步 注册sonatype账号

注册的账户名、项目名这些用英文,密码不要有转义符,后面别的地方会用到的,中文要出编码问题幺蛾子的。

地址:https://issues.sonatype.org/secure/Signup!default.jspa
看不懂英文的兄弟请用chrome网页翻译

账号注册之后似乎还有个邮箱认证把,有的话去邮箱里打开认证通过链接。
账号密码一定要记住了,保存好,并且最好是复杂的密码,后面还需要用到的。

第二步 登录sonatype账号并申请新建项目

地址:https://issues.sonatype.org/secure/Dashboard.jspa
在这里插入图片描述
去创建问题,地址:创建问题

如果你没看到这个新建按钮,是因为暂停了创建,要等开放,目前2024年2月20日看是没法创建的
Sonatype has begun the retirement process for issues.sonatype.org.If you have been instructed to sign up for a new account here in an e-mail from central-support@sonatype.com, you can ignore this notice.

在这里插入图片描述
项目选择:Community Support - Open Source Project Repository Hosting (OSSRH)

问题类型选择:New Project

描述:
For registering a new Group ID on OSSRH for publishing to Central
Project Summary: LocalCache(你的项目名)
Group Id:cn.humorchen(改为你的域名)
open source code git url:https://github.com/HumorChen/LocalCache(改为你的开源项目地址)

在这里插入图片描述
group id填你的域名,例如cn.humorchen,由于sonatype暂时关闭了新建,我从别的地方薅来了上面这个图,概要那个你就写你要发布个啥项目,我的是这样写的,如果你没有域名的话可以用github共用地址,io.github.xxx,这个xxx是你github的唯一名。建议还是自己有域名~
在这里插入图片描述

提交了问题之后等管理员处理,会评论你的,大概等半小时到半天不等。
在这里插入图片描述

然后管理员回复了,让我添加dns记录来认证这个域名是我的。
这个时候到你注册域名的那边去添加一个域名的text记录
比如我的是humorchen.cn这个域名,那就把humorchen.cn添加一条text记录,记录头是@,不要用www,记录值为管理员评论里说的那个值。
弄好了之后在评论区回复管理员已经弄好了,然后你在右上角流转状态,等管理员处理,管理员确认你这个域名是你的,看到那个解析记录了,就回回复你恭喜你加入中央仓库,你能发布快照和发行版构建到某个地址,我的是s01.oss.sonatype.org,地址一般不会变,我看到过的有s01,s02

在这里插入图片描述

第三步 准备个人GPG数字签名并发布到ubuntu

安装gnupg-w32-2.3.3_20211012.exe
下载地址:https://gnupg.org/ftp/gcrypt/binary/gnupg-w32-2.3.3_20211012.exe
在这里插入图片描述
安装完成后来生成个人签名,到命令行执行

gpg --gen-key

在这里插入图片描述

依次填入生成密钥需要的个人名字,我填的humorchen,回车,再输入邮箱,回车,再让你确认,输入O,然后输入一个密码短语,这个密码短语建议额外随机生成一个(百度在线生成随机密码,生成8位以上)
在这里插入图片描述

生成好了,下面图第一个红框告诉你的是你这个密钥文件存在哪里了,第二个是个人签名的ID,要上传到ubuntu的。
在这里插入图片描述

查看当前创建好的个人签名

gpg --list-keys

把这个秘钥上传至公钥服务器,使用如下命令:

gpg --keyserver keyserver.ubuntu.com --send-keys 秘钥ID

上传命令执行没报错误完成了就是成功了,报错了啥的就再次执行,搞几次一定能成功的。

验证是否上传成功

gpg --keyserver keyserver.ubuntu.com --recv-keys 秘钥ID

(如果要把签名导入导出可以看这个博客https://blog.csdn.net/qq_39870538/article/details/127036100)

第四步 准备maven配置

建议新开一个setting.xml给开源项目使用,我是单独下了一份maven,改了配置放一个文件夹去
在这里插入图片描述

我的配置如下,账号密码部分自己修改为自己的!

<?xml version="1.0" encoding="UTF-8"?>

<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

<!--
 | This is the configuration file for Maven. It can be specified at two levels:
 |
 |  1. User Level. This settings.xml file provides configuration for a single user,
 |                 and is normally provided in ${user.home}/.m2/settings.xml.
 |
 |                 NOTE: This location can be overridden with the CLI option:
 |
 |                 -s /path/to/user/settings.xml
 |
 |  2. Global Level. This settings.xml file provides configuration for all Maven
 |                 users on a machine (assuming they're all using the same Maven
 |                 installation). It's normally provided in
 |                 ${maven.conf}/settings.xml.
 |
 |                 NOTE: This location can be overridden with the CLI option:
 |
 |                 -gs /path/to/global/settings.xml
 |
 | The sections in this sample file are intended to give you a running start at
 | getting the most out of your Maven installation. Where appropriate, the default
 | values (values used when the setting is not specified) are provided.
 |
 |-->
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
  <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->

  <!-- interactiveMode
   | This will determine whether maven prompts you when it needs input. If set to false,
   | maven will use a sensible default value, perhaps based on some other setting, for
   | the parameter in question.
   |
   | Default: true
  <interactiveMode>true</interactiveMode>
  -->

  <!-- offline
   | Determines whether maven should attempt to connect to the network when executing a build.
   | This will have an effect on artifact downloads, artifact deployment, and others.
   |
   | Default: false
  <offline>false</offline>
  -->

  <!-- pluginGroups
   | This is a list of additional group identifiers that will be searched when resolving plugins by their prefix, i.e.
   | when invoking a command line like "mvn prefix:goal". Maven will automatically add the group identifiers
   | "org.apache.maven.plugins" and "org.codehaus.mojo" if these are not already contained in the list.
   |-->
  <pluginGroups>
    <!-- pluginGroup
     | Specifies a further group identifier to use for plugin lookup.
    <pluginGroup>com.your.plugins</pluginGroup>
    -->
  </pluginGroups>

  <!-- TODO Since when can proxies be selected as depicted? -->
  <!-- proxies
   | This is a list of proxies which can be used on this machine to connect to the network.
   | Unless otherwise specified (by system property or command-line switch), the first proxy
   | specification in this list marked as active will be used.
   |-->
  <proxies>
    <!-- proxy
     | Specification for one proxy, to be used in connecting to the network.
     |
    <proxy>
      <id>optional</id>
      <active>true</active>
      <protocol>http</protocol>
      <username>proxyuser</username>
      <password>proxypass</password>
      <host>proxy.host.net</host>
      <port>80</port>
      <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
    </proxy>
    -->
  </proxies>

  <!-- servers
   | This is a list of authentication profiles, keyed by the server-id used within the system.
   | Authentication profiles can be used whenever maven must make a connection to a remote server.
   |-->
  <servers>
    <!-- server
     | Specifies the authentication information to use when connecting to a particular server, identified by
     | a unique name within the system (referred to by the 'id' attribute below).
     |
     | NOTE: You should either specify username/password OR privateKey/passphrase, since these pairings are
     |       used together.
     |
    <server>
      <id>deploymentRepo</id>
      <username>repouser</username>
      <password>repopwd</password>
    </server>
    -->

    <!-- Another sample, using keys to authenticate.
    <server>
      <id>siteServer</id>
      <privateKey>/path/to/private/key</privateKey>
      <passphrase>optional; leave empty if not used.</passphrase>
    </server>
    -->

    <server>
      <id>ossrh</id>
      <username>你的sonatype账号</username>
      <password>你的sonatype密码</password>
    </server>
  </servers>

  <!-- mirrors
   | This is a list of mirrors to be used in downloading artifacts from remote repositories.
   |
   | It works like this: a POM may declare a repository to use in resolving certain artifacts.
   | However, this repository may have problems with heavy traffic at times, so people have mirrored
   | it to several places.
   |
   | That repository definition will have a unique id, so we can create a mirror reference for that
   | repository, to be used as an alternate download site. The mirror site will be the preferred
   | server for that repository.
   |-->
  <mirrors>
    <!-- mirror
     | Specifies a repository mirror site to use instead of a given repository. The repository that
     | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
     | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
     |
    <mirror>
      <id>mirrorId</id>
      <mirrorOf>repositoryId</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>http://my.repository.com/repo/path</url>
    </mirror>
     -->
    <!-- 阿里仓库 -->
    <mirror>
      <id>aliyunmaven</id>
      <mirrorOf>*</mirrorOf>
      <name>阿里云公共仓库</name>
      <url>https://maven.aliyun.com/repository/public</url>
    </mirror>
    <!-- 中央仓库1 -->
    <mirror>
      <id>repo1</id>
      <mirrorOf>central</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>https://repo1.maven.org/maven2/</url>
    </mirror>

    <!-- 中央仓库2 -->
    <mirror>
      <id>repo2</id>
      <mirrorOf>central</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>https://repo2.maven.org/maven2/</url>
    </mirror>


  </mirrors>

  <!-- profiles
   | This is a list of profiles which can be activated in a variety of ways, and which can modify
   | the build process. Profiles provided in the settings.xml are intended to provide local machine-
   | specific paths and repository locations which allow the build to work in the local environment.
   |
   | For example, if you have an integration testing plugin - like cactus - that needs to know where
   | your Tomcat instance is installed, you can provide a variable here such that the variable is
   | dereferenced during the build process to configure the cactus plugin.
   |
   | As noted above, profiles can be activated in a variety of ways. One way - the activeProfiles
   | section of this document (settings.xml) - will be discussed later. Another way essentially
   | relies on the detection of a property, either matching a particular value for the property,
   | or merely testing its existence. Profiles can also be activated by JDK version prefix, where a
   | value of '1.4' might activate a profile when the build is executed on a JDK version of '1.4.2_07'.
   | Finally, the list of active profiles can be specified directly from the command line.
   |
   | NOTE: For profiles defined in the settings.xml, you are restricted to specifying only artifact
   |       repositories, plugin repositories, and free-form properties to be used as configuration
   |       variables for plugins in the POM.
   |
   |-->
  <profiles>
    <!-- profile
     | Specifies a set of introductions to the build process, to be activated using one or more of the
     | mechanisms described above. For inheritance purposes, and to activate profiles via <activatedProfiles/>
     | or the command line, profiles have to have an ID that is unique.
     |
     | An encouraged best practice for profile identification is to use a consistent naming convention
     | for profiles, such as 'env-dev', 'env-test', 'env-production', 'user-jdcasey', 'user-brett', etc.
     | This will make it more intuitive to understand what the set of introduced profiles is attempting
     | to accomplish, particularly when you only have a list of profile id's for debug.
     |
     | This profile example uses the JDK version to trigger activation, and provides a JDK-specific repo.
    <profile>
      <id>jdk-1.4</id>

      <activation>
        <jdk>1.4</jdk>
      </activation>

      <repositories>
        <repository>
          <id>jdk14</id>
          <name>Repository for JDK 1.4 builds</name>
          <url>http://www.myhost.com/maven/jdk14</url>
          <layout>default</layout>
          <snapshotPolicy>always</snapshotPolicy>
        </repository>
      </repositories>
    </profile>
    -->

    <!--
     | Here is another profile, activated by the property 'target-env' with a value of 'dev', which
     | provides a specific path to the Tomcat instance. To use this, your plugin configuration might
     | hypothetically look like:
     |
     | ...
     | <plugin>
     |   <groupId>org.myco.myplugins</groupId>
     |   <artifactId>myplugin</artifactId>
     |
     |   <configuration>
     |     <tomcatLocation>${tomcatPath}</tomcatLocation>
     |   </configuration>
     | </plugin>
     | ...
     |
     | NOTE: If you just wanted to inject this configuration whenever someone set 'target-env' to
     |       anything, you could just leave off the <value/> inside the activation-property.
     |
    <profile>
      <id>env-dev</id>

      <activation>
        <property>
          <name>target-env</name>
          <value>dev</value>
        </property>
      </activation>

      <properties>
        <tomcatPath>/path/to/tomcat/instance</tomcatPath>
      </properties>
    </profile>
    -->
  </profiles>

  <!-- activeProfiles
   | List of profiles that are active for all builds.
   |
  <activeProfiles>
    <activeProfile>alwaysActiveProfile</activeProfile>
    <activeProfile>anotherAlwaysActiveProfile</activeProfile>
  </activeProfiles>
  -->
</settings>

然后到IDEA这个开源项目配置里修改项目使用的maven配置文件为指定文件,指定使用这个文件。

第五步 修改项目配置

项目需要支持javadoc、maven打包、source源码包、gpg对打包的文件签名

我的配置如下,看配置中文标注或带xxx部分,主要是配置gpg信息、licenses开源协议、scm开源项目仓库、distributionManagement 中央仓库(打包的构建发布到这)、build plugins(构建插件)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cn.humorchen</groupId>
    <artifactId>LocalCache</artifactId>
    <name>LocalCache</name>
    <version>1.0.0-RELEASE</version>
    <description>
        一个安全好用的springboot项目本地方法缓存,基于最高效的caffeine框架。
    </description>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.7.6</spring-boot.version>
        <lombok.version>1.18.6</lombok.version>
        <slf4j-api.version>1.7.7</slf4j-api.version>
        <fastjson.version>1.2.75</fastjson.version>
        <aspectjweaver.version>1.9.5</aspectjweaver.version>
        <hutool.version>5.7.13</hutool.version>
        <gpg.passphrase>你签名的密码passphrase</gpg.passphrase>
        <gpg.keyname>4D368E64007Fxxxxxxxxxxxxxxxx6337CEFB1B5</gpg.keyname>
        <gpg.homedir>D:\user\xxxxxxx\Application Data\gnupg</gpg.homedir>
    </properties>
    <licenses>
        <license>
            <name>MIT License</name>
            <url>https://github.com/HumorChen/LocalCache/blob/master/LICENSE(你的开源协议声明地址,或者你也可以直接在这指定证书)</url>
            <distribution>repo</distribution>
        </license>
    </licenses>
    <scm>
        <tag>master</tag>
        <url>https://github.com/HumorChen/LocalCache</url>
        <connection>scm:git:git@github.com:HumorChen/LocalCache.git</connection>
        <developerConnection>scm:git:git@github.com:HumorChen/LocalCache.git</developerConnection>
    </scm>

    <!-- 中央仓库地址配置,不需要修改 -->
    <distributionManagement>
        <snapshotRepository>
            <id>ossrh</id>
            <url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
        </snapshotRepository>

        <repository>
            <id>ossrh</id>
            <url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
        </repository>
    </distributionManagement>
    <developers>
        <developer>
            <name>humorchen</name>
            <email>humorchen99@gmail.com</email>
            <organization>cn.humorchen</organization>
        </developer>
    </developers>
    <dependencies>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>15.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--        hutool-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>${hutool.version}</version>
        </dependency>
        <!--        caffeine-->
        <dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
            <version>2.8.0</version>
        </dependency>
        <!--        lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
        <!--        slf4j-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j-api.version}</version>
        </dependency>
        <!--        fastjson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>
        <!--        aspectj-->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>${aspectjweaver.version}</version>
        </dependency>
        <!--        junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.example.demo.DemoApplication</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <!-- Source -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>2.2.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>jar-no-fork</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <!-- Javadoc工具 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-javadoc-plugin</artifactId>
                <version>2.10.4</version>
                <configuration>
                    <additionalJOptions>
                        <additionalJOption>-Xdoclint:none</additionalJOption>
                    </additionalJOptions>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <!-- GPG -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-gpg-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <gpgArguments>
                        <arg>--pinentry-mode</arg>
                        <arg>loopback</arg>
                    </gpgArguments>
                </configuration>
                <executions>
                    <execution>
                        <id>sign-artifacts</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>sign</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

第七步 发布项目

发布过程中如果遇到乱码请看我这个博客,我遇到了的。https://humorchen.blog.csdn.net/article/details/136172570

在IDEA里选择Maven的deploy部署
在这里插入图片描述
发布成功
在这里插入图片描述

第八步 nexus仓库查看打包好的

地址: https://s01.oss.sonatype.org/?spm=a2c6h.12873639.article-detail.10.60a1309ckig47M#stagingRepositories

点击右上角的Log In登录你的sonatype账号,再一次点开你的项目构件仓库,然后复制maven依赖即可咯。到此你完成了第一个自己的开源maven依赖!!!是不是很有成就感!!!
在这里插入图片描述

遇到过的问题

  1. 域名解析没有
    要添加@.humorchen.cn 值为评论区的那个值,dns类型选text
  2. maven导入依赖失败
    请检查你项目IDEA的maven配置,用国内阿里云仓库是能获取到这些依赖的,外网的速度慢,还可能失败。
  3. 打包javadoc乱码
    看我乱码解决办法的博客https://humorchen.blog.csdn.net/article/details/136172570
  4. 打包的时候GPG提示没有可用签名
    是因为的创建签名的时候用的git bash,导致创建的签名在那个用户下,目录不对,后面用cmd创建的签名是正常可用的,你在idea里的cmd打开查看已经创建好的签名能看到证明是对的,是可以的。
  5. 打包提示401未授权
    检查项目是否使用了我说的自定义maven setting,xml,你是否修改了密码但是setting.xml未修改,密码是否有转义符,有的话建议改密码。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络原理HTTP/HTTPS(2)

文章目录 HTTP响应状态码200 OK3xx 表示重定向4xx5xx状态码小结 HTTPSHTTPS的加密对称加密非对称加密 HTTP响应状态码 状态码表⽰访问⼀个⻚⾯的结果.(是访问成功,还是失败,还是其他的⼀些情况…).以下为常见的状态码. 200 OK 这是⼀个最常⻅的状态码,表⽰访问成功 2xx都表示…

hot100 -- 滑动窗口

目录 &#x1f33c;无重复字符 -- 最长子串 AC 滑动窗口&#xff08;桶&#xff09; &#x1f33c;所有字母异位词 AC 滑动窗口 桶 AC 滑动窗口&#xff08;优化&#xff09; &#x1f33c;无重复字符 -- 最长子串 一开始考虑用 BF暴力 或者 KMP 的&#xff0c;后来想…

安宝特AR汽车行业解决方案系列1-远程培训

在汽车行业中&#xff0c;AR技术的应用正悄然改变着整个产业链的运作方式&#xff0c;应用涵盖培训、汽修、汽车售后、PDI交付、质检以及汽车装配等&#xff0c;AR技术为多个环节都带来了前所未有的便利与效率提升。 安宝特AR将以系列推文的形式为读者逐一介绍在汽车行业中安宝…

【机器学习笔记】 15 机器学习项目流程

机器学习的一般步骤 数据清洗 数据清洗是指发现并纠正数据文件中可识别的错误的最后一道程序&#xff0c;包括检查数据一致性&#xff0c;处理无效值和缺失值等。与问卷审核不同&#xff0c;录入后的数据清理一般是由计算机而不是人工完成。 探索性数据分析(EDA 探索性数据…

PROBIS铂思金融破产后续:ASIC牌照已注销

2024年1月31日&#xff0c;PROBIS铂思金融的澳大利亚ASIC牌照 (AFSL 338241) 被注销《差价合约经纪商PROBIS宣布破产&#xff0c;澳大利亚金融服务牌照遭暂停》&#xff0c;这也就意味着&#xff0c;PROBIS铂思金融目前已经没有任何金融牌照。 值得注意的是&#xff0c;时至今日…

com.alibaba.fastjson.JSONException: toJSON error的原因

问题&#xff1a; 导出接口报错&#xff0c;显示json格式化异常 发现问题&#xff1a; 第一个参数为HttpResponse,转换成json的时候报错 修改方法&#xff1a; 1.调换两个参数的位置 2.在aop判断里边 把ServletAPI过滤掉 Before("excudeWebController()")pub…

解决NPM安装依赖包卡住的问题

引言 最近研究前端的一些技术点&#xff0c;在使用npm安装依赖包的时候发现会卡住&#xff0c;时间超时后会报如下错误 npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/babel/parser/download/babel/…

国际语言代码 Language Code 对照表速查

前言 语言代码是英国教育社会学家伯恩斯坦的术语。指在一定的语言集团中&#xff0c;特定的人群在特定的社会环境下使用的特定的言语。分为限定代码&#xff08;restricted code&#xff09;和精制代码&#xff08;elaborated code&#xff09;。语言代码是由字母或数字组成的…

Elasticsearch:将 IT 智能和业务 KPI 与 AI 连接起来 - 房间里的大象

作者&#xff1a;Fermi Fang 大象寓言的智慧 在信息技术和商业领导力的交叉点&#xff0c;蒙眼人和大象的古老寓言提供了一个富有洞察力的类比。 这个故事起源于印度次大陆&#xff0c;讲述了六个蒙住眼睛的人第一次遇到大象的故事。 每个人触摸大象的不同部位 —— 侧面、象牙…

java中的多线程(五)线程变量ThreadLocal

一、介绍 1、介绍&#xff1a; package java.lang; public class ThreadLocal<T> ThreadLocal中填充的变量属于当前线程&#xff0c;该变量对其他线程而言是隔离的&#xff0c;也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建了一个副本&am…

前中后三缀表达式

中缀表达式&#xff1a; 就是我们平常写的数学式 例如&#xff1a;a*(bc)-d 前缀表达式&#xff1a; 是指将符号位提前&#xff0c;注意计算顺序 如&#xff1a;上例计算顺序&#xff1a;(&#xff08;a*(bc))-d) 转换为前缀表达式为&#xff1a;-*abcd 后缀表达式&…

【lesson60】网络基础

文章目录 网络发展认识协议网络协议初识OSI七层模型TCP/IP五层(或四层)模型网络传输基本流程数据包封装和分用网络中的地址管理 网络发展 以前没有网络剧的工作模式是&#xff1a;独立模式:&#xff0c;计算机之间相互独立 所以多个计算机要协同开发比较难。 有了网络以后&am…

Linux系统——I/O模型

目录 1.I/O定义 2.I/O模型相关概念 3. 总结 1.I/O定义 I/O在计算机中指Input/Output&#xff0c; IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数)&#xff0c;是衡量磁盘性能的主要指标之一。IOPS是指单位时间内系统能处理的I/O请求数量&#xff0c;一般以…

【毕业设计推荐】基于MATLAB的水果分级系统设计与实现

一、课题介绍 现在商业行为中&#xff0c;在水果出厂前都需要进行质量检测&#xff0c;需要将不同等级的水果进行分级包装&#xff0c;以保证商业利益最大化。可是传统方法都是依靠人工进行检测&#xff0c;效率低下&#xff0c;主观成分大&#xff0c;并不能很好客观地评价出货…

YAPI接口自动鉴权功能部署详解

安装准备 以下操作&#xff0c;默认要求自己部署过yapi&#xff0c;最好是部署过yapi二次开发环境。 无论是选择在线安装或者是本地安装&#xff0c;都需要安装client工具。 1、yapi-cli&#xff1a;npm install yapi-cli –g&#xff0c; 2、安装后将文件夹nodejs/node_gl…

VTK通过线段裁剪

线段拆分网格 void retrustMesh(vtkSmartPointer<vtkPolyData> polydata, vtkSmartPointer<vtkPoints> intermediatePoint) {vtkSmartPointer<vtkPoints> srcPoints polydata->GetPoints();int pointSize intermediatePoint->GetNumberOfPoints();/…

搜维尔科技:分析OptiTrack光学动作捕捉应用领域!

虚拟制作 当今虚拟制作阶段低延迟、超精确摄像机跟踪的事实上的标准。 用于运动科学的 OptiTrack OptiTrack 系统提供世界领先的测量精度和简单易用的工作流程&#xff0c;为研究人员和生物力学师的研究提供理想的 3D 跟踪数据。对所有主要数字测力台、EMG 和模拟设备的本机即…

基于STM32F407的coreJSON使用教程

目录 概述 工程建立 代码集成 函数介绍 使用示例 概述 coreJSON是FreeRTOS中的一个组件库&#xff0c;支持key查找的解析器&#xff0c;他只是一个解析器&#xff0c;不能生成json数据。同时严格执行 ECMA-404 JSON 标准。该库用 C 语言编写&#xff0c;设计符合 ISO C90…

书生浦语大模型实战营-课程笔记(5)

LLM部署特点&#xff0c;内存开销大&#xff0c;TOKEN数量不确定 移动端竟然也可以部署LLM。之前以为只能在服务端部署&#xff0c;移动端作为客户端发起请求来调用大模型。 LMDeploy用于模型量化 模型量化&#xff1a;降低内存消耗 推理性能对比 量化主要作用&#xff1a;…

推荐一个内网穿透工具,支持Windows桌面、Linux、Arm平台客户端

神卓互联是一款常用的内网穿透工具&#xff0c;它可以将本地服务器映射到公网上&#xff0c;并提供域名或子域名给外部访问。神卓互联具有简单易用、高速稳定的特点&#xff0c;支持Windows桌面版、Linux版、Arm版客户端&#xff0c;以及硬件等。 神卓互联内网穿透技术简介 企…