Category

开发工具

Arthas

开发工具

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
通常,本地开发环境无法访问生产环境。如果在生产环境中遇到问题,则无法使用 IDE 远程调试。更糟糕的是,在生产环境中调试是不可接受的,因为它会暂停所有线程,导致服务暂停。
开发人员可以尝试在测试环境或者预发环境中复现生产环境中的问题。但是,某些问题无法在不同的环境中轻松复现,甚至在重新启动后就消失了。
如果您正在考虑在代码中添加一些日志以帮助解决问题,您将必须经历以下阶段:测试、预发,然后生产。这种方法效率低下,更糟糕的是,该问题可能无法解决,因为一旦 JVM 重新启动,它可能无法复现,如上文所述。
Arthas 旨在解决这些问题。开发人员可以在线解决生产问题。无需 JVM 重启,无需代码更改。 Arthas 作为观察者永远不会暂停正在运行的线程。

Arthas官方文档

查cpu高占用

  • dashboard 查看占用最高的线程
  • thread -n 3 查看占用高的线程及其堆栈

查内存高占用

  • oom崩溃的情况无法处理,需要-XX:+HeapDumpOnOutOfMemoryError
    • -XX:HeapDumpPath=/tmp/heapdump.hprof 指定dump文件位置
    • 进程还活着才可以分析
  • vmtool --action forceGc 先fullGc一次
  • dashboard 查看Memory
  • jmap -histo:live <pid> | head -n 20 查看是否有大量自定义对象 一般排名靠前的都是java的基本类型
  • heapdump --live /tmp/dump.hprof 导出文件后拖到idea或者mat软件分析
    • 在合并的路径tab中可以按照实例类型和引用关系找到引用最多对象的实例
    • 在最大对象tab中可以看到对象及其引用的对象的占用并层层展开查看引用关系
    • 保留(Retained)是这个对象及其引用的对象层层递归加起来的总内存占用,主要看这个
      • 计算的是对象的独占对象的内存占用,如果一个object还被其他object引用,则不纳入计算
      • 找到保留大小最大的几个对象,通过引用树找到持有这些对象的实例
    • 浅层(Shallow)是这个对象本身占用的内存,一般只有数组的浅层大小会很大

修改方法逻辑

  • jad --source-only com.example.demo.UserController > /tmp/UserController.java 添加 --lineNumber=false 不显示行号 -d dump文件到目录
  • 编辑补全逻辑
  • mc /tmp/UserController.java -d /tmp 编译成class
  • retransform /tmp/com/example/demo/UserController.class 热重载

查慢方法调用

  • trace com.example.demo.OrderController createOrder -n 1 添加监听
    • -n 1 指定触发次数,方法触发指定次数后自动退出,不添加则会连续监听直到ctrl c
    • 若入参或返回值过长可以输出到文件 文件路径不能使用~ 否则会创建名为~的文件
  • 输出包含方法调用栈以及行号的执行耗时
    • 输出的列表和Map不会展开内容,只会显示size

查方法入参返回值

  • watch com.example.demo.UserService login "{params, returnObj}" -n 1 添加监听
    • -n 1 指定触发次数,方法触发指定次数后自动退出,不添加则会连续监听直到ctrl c
    • 添加 -x 2 展开对象, 展开2刚好够展开Map和List
    • watch com.example.demo.UserService login "{ @com.alibaba.fastjson.JSON@toJSONString(params), @com.alibaba.fastjson.JSON@toJSONString(returnObj) }" -n 1 使用OGNL编写表达式可以输出json格式, 此时不需要-x展开
    • watch com.example.demo.UserService login "{ params, returnObj }" "params[0].name == 'test'" -n 1 使用OGNL编写条件表达式,可以在递归调用等地方过滤不想要收集的方法调用 如果在win等无法输入中文的情况下可以用unicode编码 "'\u6d4b\u8bd5\u540d\u5b57' == params[0]"

回退vscode版本 & 多版本共存

开发工具

最近更新了vscode,有一天需要连接远程服务器的时候发现报错说服务器glibc什么的版本过旧不支持了,但是服务器又不是我的,没法更新系统,所以需要回退旧版本。同时我有一个新版本的vscode,因为claude code插件不支持旧版本vscode,所以需要两个vscode互相隔离,于是就有了这个博客。

下载旧版本vscode

因为我需要多版本共存,所以需要一个免安装的版本,避免他和现有版本产生冲突

首先在faq中找到下载地址的格式,然后填入对应的版本

https://update.code.visualstudio.com/{version}/win32-x64-archive/stable

运行

如果下载之后直接运行,会直接使用当前用户目录下的缓存,比如插件啥的,可能会产生冲突,所以需要指定各种目录,我直接给出启动脚本

bat
@echo off

set VSCODE_DIR=C:\Users\Administrator\Downloads\VSCode-win32-x64-1.96.4
set "VSCODE_EXECUTABLE=%VSCODE_DIR%\Code.exe"
set "USER_DATA_DIRECTORY=%VSCODE_DIR%\user-profile"
set "EXTENSIONS_DIR=%VSCODE_DIR%\user-extensions"

start "VSCode Portable" "%VSCODE_EXECUTABLE%" --user-data-dir "%USER_DATA_DIRECTORY%" --extensions-dir "%EXTENSIONS_DIR%"

用这个脚本启动则vscode会有独立的用户数据目录和插件目录,避免和安装版本的产生冲突

github student developer pack

开发工具

申请时间 2024.03.26

准备github账号

  1. 注册并登录github
  2. 右上角头像 -> 设置
  3. 左边选择 billing and plans 下的 payment infomation
  4. 填写账单地址,主要名字必须是真名,和学籍信息一致的名字,firstname长度不够要求可以在后面加空格

绑定edu邮箱

  1. 链接:https://github.com/settings/emails
  2. 绑定邮箱并通过验证,这儿我绑定的是edu.cn的邮箱

开始申请

  1. 链接:https://education.github.com/discount_requests/application
  2. 在这之前需要确定你的定位在学校,手机可以使用fake location(要root),pc可以打开开发者工具,点右上角三个点 -> 更多工具 -> 传感器,在打开的界面中位置选择其他,然后输入经纬度
  3. 修改好定位后刷新网页,并确保接下来的步骤中不要使用梯子
  4. 在下面的邮箱列表中选择 edu.cn 邮箱
  5. 输入学校全名,此处会有补全,但是速度可能较慢,最终提交时应该是全英文的名字
  6. 点击下方的 continue(ps:此处我一开始用手机还是pc都点continue无效,最后用的f12修改传感器解决)
  7. 第二个界面要求拍照上传凭证,pc无法完成,但是申请的进度是可以保留的,因此我们用手机打开申请链接,可以继续完成第二步;手机上传照片,网上很多推荐用学籍报告之类的,实际上手写也是可以的,github应该是ocr识别的;此处我上传先是submit怎么点都不成功,回到原界面,最后用开发者工具打开手机chrome的调试才发现是payload too large了(点名批评gh开发者),最终使用前置摄像头拍了一张很糊的照片(因为很糊,所以上面只有关键信息,没有把二维码和标题之类的拍进去)
  8. 提交

构建KonaJDK

开发工具

最近准备参加OpenSourceTalent,题目是KonaJDK相关的,首先要构建KonaJDK,这儿我踩了很多坑

尝试在windows构建

  • 我一开始尝试使用mingw构建,但是configure中要求的make版本不一致
    configure: Found GNU make version GNU Make 4.2.1 at /f/App/mingw64/bin/make, but it is not for msys (it says: Built for x86_64-w64-mingw32). Ignoring. configure: error: Cannot find GNU make 3.81 or newer! Please put it in the path, or add e.g. MAKE=/opt/gmake3.81/make as argument to configure.

  • 然后我尝试使用msys2构建,make版本没有问题,但是configure死活不认我装的vs2022,使用vs2013也一样构建失败(后来在ci里看到它使用的是vs2017)
    configure: Could not succesfully extract the envionment variables needed for the VS setup.
    configure: Try setting --with-tools-dir to the VC/bin directory within the VS installation
    configure: or run "bash.exe -l" from a VS command prompt and then run configure from there.
    configure: error: Cannot continue

  • 宣告放弃,下各种版本的vs弄得我头都大了

尝试在Ubuntu构建

  • 首先我电脑里有一个之前用过的Ubuntu22.04,我先尝试在上面构建,但是编译的时候会出现各种语法错误导致无法完成编译

  • 然后我去翻Kona的ci,看到了他的构建脚本,使用的是Ubuntu20.04
  • 最终我下了一个新的Ubuntu20.04镜像,按照ci的构建脚本构建成功了(但是还是要自己apt装一些依赖,这ci依赖不全怎么能构建出来的?

Ubuntu上的构建过程

bash
# ci里装的依赖
apt-get install openjdk-8-jdk gcc-9 g++-9 libxrandr-dev libxtst-dev libcups2-dev libasound2-dev
# 自己安装时缺少的依赖
apt-get install libfontconfig1-dev libfreetype6-dev

bash configure \
--with-conf-name=linux-x64 \
--with-target-bits=64 \
--enable-debug \
--with-build-number=b00 \
--with-boot-jdk=/usr/lib/jvm/java-8-openjdk-amd64 \
--with-zlib=bundled \
--with-freetype-lib=/usr/lib/x86_64-linux-gnu \
--with-freetype-include=/usr/include/freetype2

make images

总结:构建文档没一个能信的,只有ci不会骗人

准备等空了再挑战一下在win构建KonaJDK,成功了再来更新

vscode ssh 插件配置及使用

开发工具

安装ssh插件

刚刚安装好是空白的

配置ssh连接

点击右上角的齿轮

选择一个地方创建设置,此处我选择第一个,他会创建一个新的默认配置

参考 https://zhuanlan.zhihu.com/p/35922004

此处我连接的远程服务器是使用密钥的,示例配置如图

连接远程服务器

配置完成后保存,点击ssh targets中ssh右侧的按钮在新窗口中打开连接

选择服务器类型,此处我是linux

首次连接会提示是否接收服务器指纹,选择continue

若使用的用户不是管理员用户,可能需要参考以下文章配置config和私钥(若使用私钥)文件权限

https://windowsreport.com/bad-owner-or-permissions-on-ssh-config/

远程文件

点击左侧的资源管理器,可以打开远程文件夹(不要打开文件很多的文件夹,比如/,插件会无法监听文件变更)

远程命令行

在下方的状态栏上向上拖动打开命令行

使用powershell批量将xlsx转csv

开发工具

最近帮朋友写自动转xlsx到csv的脚本,尝试了aspose-cells和poi,前者闭源还混淆,后者速度慢很多,后来发现powershell脚本可以直接调用excel的api,最后就选择了powershell脚本

注意事项

  1. 此脚本需要电脑上安装Excel
  2. 此脚本需要电脑上安装高版本的powershell

使用方式

  1. 复制脚本到文件并修改文件后缀名到.ps1
  2. 在脚本所在的文件夹中新建文件夹并重命名为input,把需要转换的文件放进去
  3. 右键脚本,选择使用powershell7运行 或者 右键 -> 属性 修改打开方式为pwsh(在安装高版本powershell的位置找),然后直接运行

脚本内容

powershell
chcp 65001 > nul
Echo "将需要转换的文件放在input文件夹中, 输出的文件放在output文件夹中"
if (!(Test-Path input)) { Mkdir input > $null }
if (!(Test-Path output)) { Mkdir output > $null }
$WorkingDir = (Get-Location).Path
$Start = Get-Date -UFormat %s
$Files = Get-ChildItem -Path "input" -Recurse | Where-Object { $_.Name -match ".*\.xls[xm]?" }
$Files | ForEach-Object -Parallel {
    $Start = Get-Date -UFormat %s
    $Excel = New-Object -ComObject Excel.Application
    $WorkingDir = $using:WorkingDir
    $InFileName = $_.name
    $OutFileName = "$InFileName.csv"
    Echo "处理中... $InFileName -> $OutFileName"
    $OutFilePath = "$WorkingDir\output\$OutFileName"
    if (Test-Path $OutFilePath) { Remove-Item -Path $OutFilePath }

    $Excel.Workbooks.Open("$WorkingDir\input\$InFileName").Worksheets.Item(1).SaveAs("$OutFilePath", 62)

    $Time = (Get-Date -UFormat %s) - $Start
    Echo "处理完成 $OutFilePath 耗时${Time}秒"
    $Excel.Quit()
}
Get-Process -name Excel | Where-Object { $_.mainWindowTitle -eq "" } | ForEach-Object { Stop-Process $_.Id }
$Time = (Get-Date -UFormat %s) - $Start
$Count = $Files.Count
Echo "全部文件处理完成, 共${Count}个文件, 耗时${Time}秒"
Timeout -t 3

脚本会从input文件夹中寻找后缀为.xls.xlsx.xlsm的文件,将他的第一张表转换成csv格式并保存到output文件夹

SaveAs的第二个参数可以自行修改,参考

ps powershell还挺好用,比batch强多了

以及一个合并csv的脚本(合并表头)

powershell
chcp 65001 > nul
Write-Output "将合并output文件夹中的csv文件, 输出到output.csv"
if (!(Test-Path input)) { Mkdir input > $null }
$WorkingDir = (Get-Location).Path
$Start = Get-Date -UFormat %s
$Files = Get-ChildItem -Path "output" -Recurse | Where-Object { $_.Name.EndsWith(".csv") }
if ($Files.Count -le 1) {
    Timeout -t 3
    exit
}
# 忽略的行数, 不包括表头
$Ignore = 0
$Flag = $true
$Out = [System.IO.File]::OpenWrite("$WorkingDir\output.csv")
$Writer = New-Object System.IO.StreamWriter($Out, [System.Text.UTF8Encoding]::new($true))
$Files | ForEach-Object {
    $Stream = [System.IO.File]::OpenRead("$WorkingDir\output\$($_.name)")
    $Reader = New-Object System.IO.StreamReader($Stream)
    # 忽略前n行
    if ($Ignore -ne 0) {
        foreach ($__ in 1..$Ignore) { $Reader.ReadLine() > $null }
    }
    $Head = $Reader.ReadLine()
    # 表头行
    if ($Flag) {
        $Flag = $false
        $Writer.WriteLine($Head)
    }

    while ($Line = $Reader.ReadLine()) {
        $Writer.WriteLine($Line)
    }

    $Reader.Close()
    $Stream.Close()
}
Write-Output "全部文件合并完成, 共$($Files.Count)个文件, 耗时$((Get-Date -UFormat %s) - $Start)秒"
Timeout -t 3

win环境下配置gpg密钥

开发工具

本文中使用的密钥为示例密钥,并无实际作用

安装git

https://git-scm.com/downloads

打开git bash

在桌面上右键打开菜单,点击

生成gpg密钥

参考文档 https://docs.github.com/zh/authentication/managing-commit-signature-verification/generating-a-new-gpg-key

输入指令 gpg --full-generate-key

bash
$ gpg --full-generate-key # 输入生成gpg密钥的指令
gpg (GnuPG) 2.2.29-unknown; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want: # 选择你想要的密钥类型,默认即可
   (1) RSA and RSA (default) # 默认值
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
  (14) Existing key from card
Your selection? # 回车,使用默认值(rsa)
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 4096 # 此处我手动输入4096,因为git文档中注明 `密钥必须至少是 4096 位`
Please specify how long the key should be valid. # 选择有效期
         0 = key does not expire # 默认值,永久生效
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) # 回车,使用默认值
Key does not expire at all # 提示密钥不会过期
Is this correct? (y/N) y # 输入y并回车

GnuPG needs to construct a user ID to identify your key. # 需要输入个人信息

Real name: qwert # 输入名字,此处输入的是qwert
Email address: 123@456.com # 输入邮箱,此处输入的是123@456.com
Comment: test # 输入注释,此处输入的是test
You selected this USER-ID:
    "qwert (test) <123@456.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? # 输入o则确认信息无误,生成密钥;输入q则取消生成并退出

输入o并回车后会跳出弹窗让你输入密码并确认(过短会提示,可以强制使用)

查看已有密钥 gpg --list-secret-keys --keyid-format=long

bash
$ gpg --list-secret-keys --keyid-format=long
gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   2  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 2u
/c/Users/Administrator/.gnupg/pubring.kbx
-----------------------------------------
sec   rsa4096/25F10366757A2676 2023-02-13 [SC]
      112C798ADD267E3918A0663825F10366757A2676
uid                 [ultimate] qwert (test) <123@456.com>
ssb   rsa4096/9DE000ED74E49E6B 2023-02-13 [E]

导出公钥

在git bash中输入 gpg --armor --export 25F10366757A2676

注意,此处最后的数组是你生成的密钥对应的id,也就是上述步骤中sec开头的行,rsa4096/之后的那一串字符,此处是 25F10366757A2676

导出得到的公钥格式应该是如下格式

bash
$ gpg --armor --export 25F10366757A2676
-----BEGIN PGP PUBLIC KEY BLOCK-----

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
=i2+O
-----END PGP PUBLIC KEY BLOCK-----

将公钥导入github

github设置 https://github.com/settings/keys

添加新gpg密钥 https://github.com/settings/gpg/new

文档参考 https://docs.github.com/zh/authentication/managing-commit-signature-verification/adding-a-gpg-key-to-your-github-account

打开添加新gpg密钥界面并填入title和key

title可以写一个名字,用于区分不同的公钥

key写上面步骤中导出的公钥

按照上述生成的内容填充后应该是如下格式

点击下方的Add GPG key将此gpg密钥添加到git中

设置git在提交中启用gpg签名

开启commit使用gpg签名 git config --global commit.gpgsign true

将 Git 配置为默认对所有提交进行签名 git config --global user.signingkey 25F10366757A2676

设置之后idea若不开启使用gpg签名则会提交失败

设置idea在提交时使用gpg签名

在idea设置中找到版本控制 > git,点击配置GPG密钥,勾选使用GPG密钥签署提交并在下方选择框中选择使用的密钥

之后提交推送时会弹窗提示输入密码

删除gpg密钥

删除密钥有三个选项:--delete-keys--delete-secret-keys--delete-secret-and-public-key
--delete-keys表示从公钥钥匙圈上删除密钥,也就是一同删除公钥和对应的私钥。在分批模式(batch mode)下,密钥必须使用指纹表示,或者使用--yes选项。
--delete-secret-keys表示从私钥钥匙圈上删除密钥。
--delete-secret-and-public-key--delete-keys一样,但是如果私钥存在的话,会先移除私钥。在分批模式下,密钥必须使用指纹表示。

此处在git bash中输入 gpg --delete-secret-and-public-key 25F10366757A2676

注意,此处最后的数组是你生成的密钥对应的id,也就是上述步骤中sec开头的行,rsa4096/之后的那一串字符,此处是 25F10366757A2676

bash
$ gpg --delete-secret-and-public-key 25F10366757A2676
gpg (GnuPG) 2.2.29-unknown; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


sec  rsa4096/25F10366757A2676 2023-02-13 qwert (test) <123@456.com>

Delete this key from the keyring? (y/N) y # 输入y并回车
This is a secret key! - really delete? (y/N) y # 输入y并回车

pub  rsa4096/25F10366757A2676 2023-02-13 qwert (test) <123@456.com>

Delete this key from the keyring? (y/N) y # 输入y并回车
# 弹窗验证

gradle打包依赖进jar

开发工具
kotlin
tasks.create<Jar>("fatJar") {
    archiveBaseName.set(project.name + "-all")
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
    manifest {
        attributes["Main-Class"] = "top.e404.bot.loader.Main"
    }
    val exclude = listOf(
        "LICENSE.txt",
        "META-INF/MANIFSET.MF",
        "META-INF/maven/**",
        "META-INF/*.RSA",
        "META-INF/*.SF"
    )
    val dependencies = configurations.runtimeClasspath.get().map(::zipTree)
    from(dependencies).exclude {
        it.path in exclude
    }
    with(tasks.jar.get())
}

或者使用 shadow 插件

kotlin
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  kotlin("jvm") version "1.7.21"
  id("com.github.johnrengelman.shadow") version "7.1.2"
}

group = "top.e404"
version = "1.0.0"

repositories {}

dependencies {}

tasks.shadowJar {
  archiveFileName.set("${project.name}-${project.version}-all.jar")
}

Maven设置阿里云镜像源

开发工具

win: C:\Users\用户名\.m2

linux: /home/用户名/.m2

正常情况下在此文件夹下会有

  1. repository:存放下载的依赖
  2. settings.xml:maven的配置

此处的settings.xml就是需要设置的文件,若没有可自行新建

下面贴出我的设置

xml
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                          https://maven.apache.org/xsd/settings-1.0.0.xsd">
  	<!-- 设置储存库位置 -->
    <localRepository>D:/.m2/repository</localRepository>
    <!-- 设置下载源 -->
  	<mirrors>
      	<!-- 阿里云 -->
		<mirror>  
			<id>nexus-aliyun</id>  
			<mirrorOf>central</mirrorOf>    
			<name>Nexus aliyun</name>  
			<url>http://maven.aliyun.com/nexus/content/groups/public</url>  
		</mirror>
		<!-- 默认仓库 -->
		<mirror>
			<id>repo1</id>
			<mirrorOf>central</mirrorOf>
			<name>Human Readable Name for this Mirror.</name>
			<url>http://repo1.maven.org/maven2/</url>
		</mirror>
		<mirror>
			<id>repo2</id>
			<mirrorOf>central</mirrorOf>
			<name>Human Readable Name for this Mirror.</name>
			<url>http://repo2.maven.org/maven2/</url>
		</mirror>
	</mirrors>
</settings>

Idea安装&白嫖JetBrain软件方法

开发工具

这里以IDEA为例,JetBrain的软件都可以使用此方法白嫖

下载

官网下载

https://www.jetbrains.com/idea/download/#section=windows

安装

其实不需要改什么设置,这里我只改了安装路径

很多新手在意的,但其实这里什么都不点也没事 很多新手在意的,但其实这里什么都不点也没事

激活

获取激活工具

首先访问**https://jetbra.in/s**获取软件

打开后从所有可用页面中选择任意一个能够访问的, 打开后是如下界面

点击jetbra.zip下载软件

下载并解压到新目录(目录路径中不要有中文字符)

安装

点击脚本安装(安装需要一段时间)

添加javaagent

安装完成后打开idea安装目录(默认在C:\Program Files\JetBrains\IntelliJ IDEA 202x.x.1\bin)

选中文件idea64.exe.vmoptions右键编辑, 在最后一行添加如下内容

此处我将jetbra直接解压在c盘, 所以路径是C:/jetbra/ja-netfilter.jar. 若你安装在D盘的App目录下, 则需要使用D:/App/jetbra/ja-netfilter.jar

添加完成后打开之前的网站, 选择你要激活的软件(比如idea / pycharm), 点击下面的按钮复制激活码(若点击后没有复制,请在之前的步骤中选择别的镜像网站)

将激活码复制到软件中点击激活

最后

享受专业版的IDEA

此方法适用于JetBrain家的所有软件, 截至2023.3.24最后一次更新, 此激活工具都是可以正常使用的

补充

若激活一直失败可以参考https://www.cnblogs.com/airlongdianblog/p/18418285

如何查找Maven/Gradle依赖

开发工具

阿里云(推荐)

如何使用阿里云镜像

搜索依赖 https://developer.aliyun.com/mvn/search

搜索依赖有两种模式,一种是使用关键词的搜索,另一种是知道依赖的group和artifact的情况下精准搜索

关键词

精准搜索

精准搜索时可以只填一个参数模糊匹配

这里点击蓝色的依赖名字,可以打开如下界面

这里也可以直接生成maven的依赖(虽然没有生成gradle格式的依赖,但是在IDEA中直接复制到build.gradle中是可以自动转换格式的)

中央仓库(不翻墙需要过人机验证)

搜索依赖 https://mvnrepository.com/

首先搜索,找到自己要的依赖并打开

找到自己需要的版本打开

可以看到此处显示了依赖的详细信息,下方还会自动生成各种格式的依赖,可以直接复制到项目里

Gradle设置阿里云镜像源

开发工具

Gradle设置

首先找到Gradle的用户目录,默认情况下在 C:\Users\你的用户名\.gradle

如果设置了 GRADLE_HOME 环境变量的话就是你设置的目录

找到家目录中的 init.gradle 文件,如果没有就新建一个

在其中添加如下代码

纯文本
buildscript {
    repositories {
        maven {
            url 'https://maven.aliyun.com/repository/public'
        }
        maven {
            url 'https://maven.aliyun.com/repositories/jcenter'
        }
    }
}

allprojects {
    repositories {
        maven {
            url 'https://maven.aliyun.com/repository/public'
        }
        maven {
            url 'https://maven.aliyun.com/repositories/jcenter'
        }
    }
}

仓库名

简介

实际地址

使用地址

jcenter

JFrog公司提供的仓库

http://jcenter.bintray.com

https://maven.aliyun.com/repository/jcenter
https://maven.aliyun.com/nexus/content/repositories/jcenter

mavenLocal

本台电脑上的仓库

{USER_HOME}/.m2/repository

C:/Users/{USER_NAME}/.m2/repository (Windows)
/home/{USER_NAME}/.m2/repository (Linux)

mavenCentral

Sonatype公司提供的中央库

http://central.maven.org/maven2

https://maven.aliyun.com/repository/central
https://maven.aliyun.com/nexus/content/repositories/central

google

Google公司提供的仓库

https://maven.google.com

https://maven.aliyun.com/repository/google
https://maven.aliyun.com/nexus/content/repositories/google
https://dl.google.com/dl/android/maven2

jitpack

JitPack提供的仓库

https://jitpack.io

https://jitpack.io

public

jcenter和mavenCentral的聚合仓库

https://maven.aliyun.com/repository/public
https://maven.aliyun.com/nexus/content/groups/public

gradle-plugin

Gradle插件仓库

https://plugins.gradle.org/m2

https://maven.aliyun.com/repository/gradle-plugin
https://maven.aliyun.com/nexus/content/repositories/gradle-plugin

解决vscode安装go插件失败的问题

开发工具

设置go的代理

打开cmd,并在cmd中分别输入以下代码,作用是设置代理

go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.io,direct

手动安装

在命令行中输入以下代码安装

手动输入代码以安装

go get -u -v github.com/mdempsky/gocode
go get -u -v github.com/uudashr/gopkgs/v2/cmd/gopkgs
go get -u -v github.com/ramya-rao-a/go-outline
go get -u -v github.com/acroca/go-symbols
go get -u -v golang.org/x/tools/cmd/guru
go get -u -v golang.org/x/tools/cmd/gorename
go get -u -v github.com/cweill/gotests/...
go get -u -v github.com/fatih/gomodifytags
go get -u -v github.com/josharian/impl
go get -u -v github.com/davidrjenni/reftools/cmd/fillstruct
go get -u -v github.com/haya14busa/goplay/cmd/goplay
go get -u -v github.com/godoctor/godoctor
go get -u -v github.com/go-delve/delve/cmd/dlv
go get -u -v github.com/stamblerre/gocode
go get -u -v github.com/rogpeppe/godef
go get -u -v github.com/sqs/goreturns
go get -u -v golang.org/x/lint/golint

参考自 https://blog.netimed.cn/archives/go/20201111/319.html

在VSCode中直接运行代码

开发工具

支持的语言

Run code snippet or code file for multiple languages: C, C++, Java, JavaScript, PHP, Python, Perl, Perl 6, Ruby, Go, Lua, Groovy, PowerShell, BAT/CMD, BASH/SH, F# Script, F# (.NET Core), C# Script, C# (.NET Core), VBScript, TypeScript, CoffeeScript, Scala, Swift, Julia, Crystal, OCaml Script, R, AppleScript, Elixir, Visual Basic .NET, Clojure, Haxe, Objective-C, Rust, Racket, Scheme, AutoHotkey, AutoIt, Kotlin, Dart, Free Pascal, Haskell, Nim, D, Lisp, Kit, V, SCSS, Sass, CUDA, Less, Fortran, and custom command

来自插件的详细介绍

安装VSCode

安装VSCode,已有的跳过

安装Code Runner插件

安装完成后会在右上角显示运行的按钮

如果文件格式正确的话点击了运行按钮会直接执行

注意

注意文件格式不能选错,否则可能会显示

笔者一开始就选错了文件格式

这里应该用下面的javascript(黄色图标的那个)