开发工具分享
  • 首页
  • 计算科学
  • 文化旅游
  • 项目和网站
    • OSSEZ 计算技术
    • USRealEstate 社区
    • 地区文化
    • CWIKI.US
    • BUG.OSSEZ.COM
    • RSS.OSSEZ.COM
CWIKIUS.CN
一个有独立思考和温度的清新站
Computer Science

Java 项目还需要 joda 吗

因为众所周知的原因,老的 Java 中的日期处理是非常不好用但是又不得不用的 API。 而且经常混乱还容易出错,相信大家应该都用过救民于水火的 joda Datetime 对象吧,简直是活菩萨。     时间来到 JDK 8 以后的版本了,我们还需要使用 joda 吗? 结论 根据官方的说法,joda 项目已经不再积极维护了。 Joda-time is no longer in active development except to keep timezone data up to date. From Java SE 8 onwards, users are asked to migrate to java.time (JSR-310) - a core part of the JDK which replaces this project. 上面的原文就是 Joda 已经不再积极进行开发了,只是进行一些时区数据的维护了。 所有的功能你应该都可以使用 java.time 来实现了。 简单来说就是如果你使用的是 JDK 8 以后的版本,你可以慢慢将 Joda 从你的项目中移除了,如果你还使用的是早期的版本,那么你还是需要导入的。     从官方的代码来看,也已经超过有 1 年多没有提交任何代码了。 还是感觉有点遗憾的,可能很多人都已经习惯 DateTime 来 new 一下然后进行一堆计算。 使用体验 针对 JDK 的 java.time 如果你需要获得当前的时间。 Date-Time API 的核心类之一是 Instant 类,它表示时间轴上的纳秒开始。 Instant 类返回的值计算从 1970 年 1 月 1 日(1970-01-01T00:00:0Z)第一秒开始的时间, 也称为 EPOCH。 发生在时期之前的瞬间具有负值,并且发生在时期后的瞬间具有正值。 Instant 不包含年,月,日等单位。但是可以转换成 LocalDateTime 或 ZonedDateTime, 如下 把一个 Instant + 默认时区转换成一个 LocalDateTime。 无论是 ZonedDateTime 或 OffsetTimeZone 对象可被转换为 Instant 对象,因为都映射到时间轴上的确切时刻。 但是,相反情况并非如此。 要将 Instant 对象转换为 ZonedDateTime 或 OffsetDateTime 对象,需要提供时区或时区偏移信息。 我们可以考察下面的这些代码片段: Instant instant = Instant.now(); System.out.println("------"); System.out.println(instant.toString()); System.out.println(instant.truncatedTo(ChronoUnit.SECONDS).toString()); System.out.println(instant.toString()); ZonedDateTime zonedDateTime = ZonedDateTime.now(); System.out.println("------"); System.out.println(zonedDateTime.toString()); System.out.println(zonedDateTime.toInstant().toString()); Date date = new Date(); System.out.println("------"); System.out.println(date.toString()); System.out.println(date.toInstant().toString()); 对应的输出为: ------ 2021-08-13T18:20:18.977845200Z 2021-08-13T18:20:18Z 2021-08-13T18:20:18.977845200Z ------ 2021-08-13T14:20:18.992847200-04:00[America/New_York] 2021-08-13T18:20:18.992847200Z ------ Fri Aug 13 14:20:18 EDT 2021 2021-08-13T18:20:18.993Z 针对上面的理解是,Instant 对象获得是当前的 UTC 时间,在这个时间中如果你不希望显示毫秒的话,你可以使用 truncatedTo 方法来格式化显示。 Instant 类是 immutable (不可变)的,因此就算你 truncatedTo 过后也不可以改变 Instant 对象。除非你重新 new 一个。 使用 ZonedDateTime 创建一个对象和 Date 创建一个对象是一样的,都是获得当前时区的时间。 例如我们现在是在美国东部时间,那么上面 2 个对象将会获得当前计算机的时间,同时上面 2 个对象还提供了 toInstant() 方法,这个方法将会显示当前时间对应的 UTC 时间。 从输出就可以看出来。 具体的一些转换我们在后续的学习文章中再逐步列出。 进行一些总结就是: Instant 在 new 了以后是不可变的,总是指向 UTC 的时间。 如果需要转换带有时区的本地时间,那么需要在转换的时候添加时区偏移量。 Date 和 ZonedDateTime 创建的时间为带有时区的本地计算机的时间。 Date 和 ZonedDateTime 都可以转换为 Instant,不需要添加时区偏移量。   https://www.ossez.com/t/java-joda/13686

2021年08月14日 0Comments 578Browse 0Like Read more
Computer Science

Java Array 和 String 的转换

英文标题【Array to String Conversions】 概述 本页面中的内容对 Array 和 String 之间互相进行转换的方法进行一些说明。 我们可以使用 原生 Java(vanilla Java) 或者一些第三方的 Java 工具类来实现这个转换。 将 Array 转换为 String 在有时候我们希望将字符串的数字或者整数类型的数组转换为字符串。但是如果我们直接使用 toString() 来进行转换的话,你可能会得到类似下面 Ljava.lang.String;@74a10858 的字符串。 上面的字符串显示的是对象的类型和当前这个对象的哈希代码。 但是, java.util.Arrays 工具类也能够支持一些 toString() 的方法来将 Array 转换为 String。 Arrays.toString() 将输入的数组转换为字符串,在转换后的字符串将会使用逗号分隔符,同时在字符串的前后会添加一个方括号 []。 可以考察下面的代码: String[] strArray = {"one", "two", "three"}; String joinedString = Arrays.toString(strArray); assertEquals("[one, two, three]", joinedString); int[] intArray = {1, 2, 3, 4, 5}; joinedString = Arrays.toString(intArray); assertEquals("[1, 2, 3, 4, 5]", joinedString); StringBuilder 的 append() 方法 这个是基于 Java 的原生实现,你可以对需要转换的数组进行遍历,然后将遍历的结果使用 append() 方法添加到字符串后面。 String[] strArray = {"Convert", "Array", "With", "Java"}; StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < strArray.length; i++) { stringBuilder.append(strArray[i]); } String joinedString = stringBuilder.toString(); assertEquals("ConvertArrayWithJava", joinedString); 另外,如果你的数组中存储的数据是整形的话,那么你可以使用方法转换函数,首先将整数类型转换为字符串后再添加。 Java Streams API 从 Java 8 及其以上的版本,你可以使用 String.join() 方法将给出的数组元素使用不同的连接字符串连接在一起,在我们使用案例中,我们使用空白字符进行连接。 String joinedString = String.join("", new String[]{"Convert", "With", "Java", "Streams"}); assertEquals("ConvertWithJavaStreams", joinedString); 更多的是,我们可以使用 Java Streams API 中的 Collectors.joining() 方法来进行连接,这个连接的方法将会保留和输入数据相同的顺序。 String joinedString = Arrays .stream(new String[]{"Convert", "With", "Java", "Streams"}) .collect(Collectors.joining()); assertEquals("ConvertWithJavaStreams", joinedString); StringUtils.join() Apache Commons Lang 为字符串处理提供了非常好的方法,能够很好的帮我们解决上面的问题。 这个 join 的方法可以通过输入的数据进行自动进行合并,合并的结果与你输入数据的顺序相同。 String joinedString = StringUtils.join(new String[]{"Convert", "With", "Apache", "Commons"}); assertEquals("ConvertWithApacheCommons", joinedString); Joiner.join() 同样的 Guava 也提供了同样的工具类来使用。 例如,我们可以使用下面的代码来对数组进行连接。 String joinedString = Joiner.on("") .skipNulls() .join(new String[]{ "Convert", "With", "Guava", null }); assertEquals("ConvertWithGuava", joinedString); 将字符串转换为数组 同样的,在有些时候,我们希望能够将字符串转换为数组。 最常用的情况就是有一个输入的字符串,使用特定的分隔符,我们需要按照分隔符的位置将字符串拆分为数组。 String.split() 这个是最简单的方法了,可以直接把字符串中的字符使用给定的字符进行拆分,如下面的代码: String[] strArray = "loremipsum".split(""); 上面的代码将会生成下面的输出,因为我们没有给定任何分隔符,所以这个方法将会按照字符进行拆分。 ["l", "o", "r", "e", "m", "i", "p", "s", "u", "m"] StringUtils.split() 另外,可能用得最多的就是 Apache 的 Commons 中的 StringUtils ,这个能够对指定的字符串进行拆分。 如果使用 String 的方法进行拆分的话,可能会遇到空对象的问题,例如你输入的字符串可能是空字符串,这个时候 String 自带的原生方法将会抛出空异常。 如果使用 StringUtils 方法的话,可以有效的避免空对象的异常,因此这个工具类是非常常用的。在默认的情况下,这个方法使用的是空格作为分隔符。 String[] splitted = StringUtils.split("lorem ipsum dolor sit amet"); 上面的方法将会输出下面的数组。 ["lorem", "ipsum", "dolor", "sit", "amet"] Splitter.split() 最后,你还可以使用 Guava 的拆分 API,如果 Apache Commons 提供的方法,通常 Guava 也能提供类似的。 例如我们可以使用下面的方法进行拆分,可以看到的是,我们在拆分的时候可以同时对结果进行处理。 List<String> resultList = Splitter.on(' ') .trimResults() .omitEmptyStrings() .splitToList("lorem ipsum dolor sit amet"); String[] strArray = resultList.toArray(new String[0]); 上面的代码能够生成下面的结果: ["lorem", "ipsum", "dolor", "sit", "amet"] 结论…

2021年08月13日 0Comments 757Browse 0Like Read more
Computer Science

Discourse 如何查看自己发布的主题

有朋友问,如何在 Discourse 中查看自己的主题,以便于对自己发布的主题进行修改。 这个主要是在我们其中一个供客户发布租房信息的网站上面。 进入路径 其实是可以从你的用户的头像中进入的。 在页面的左上角选择你的用户头像,然后进行单击。然后选择最右侧的图标下面的活动。 如下图: 然后可以从左侧导航进行查看自己发布的内容。 如果你在一个网站上面发布的内容比较多的话,那么可能还只能通过主题搜索功能更加好一些。     在列表中,你还可以看到你的内容的被访问的数量,来了解你发布的内容的活跃程度。   https://www.ossez.com/t/discourse/13684

2021年08月13日 0Comments 842Browse 0Like Read more
Computer Science

Discourse 用户的邮件无法投递的时候如何处理

Discourse 对邮件的依赖程度是非常高的。 通常来说用户可能会因为你的网站发送邮件过多而拒收,这个时候如果你使用的是第三方的邮件服务器的话,通常在日志上会显示拒绝。 对拒绝的邮件我们通常还是希望留住这个用户不要删除。 根据 Discourse 的后台,我们考古后发现有一个 Deactivate Account 功能。 这个功能应该对用户进行取消激活,用户就收不到电子邮件了,但是用户的数据还是在网站上的,用户还可以继续激活邮件后使用。     这个应该是比较好的解决方案。 不知道还有没有其他的解决方案?可以供选择? https://www.ossez.com/t/discourse/13683

2021年08月13日 0Comments 737Browse 0Like Read more
Computer Science

IntelliJ IDEA 如何在 Java 中进行快速注释

Java 的注释有 2 种 //. 和 /*...*/ IntelliJ IDEA 可以使用下面的快捷键来对代码进行注释: Ctrl+/: for 单行注释 (//…) Ctrl+Shift+/: 块注释 (/…/) Java 注释类型 如果你对上面的所谓单行注释和块注释不明白的话。 就看看下面的图就好了:     通常在 IDE 中,不同的注释类型颜色也是不一样的。 灰色的是行注释。 在这里有一个小技巧是,如果你想一次连续注释多行的话,你不需要每一行每一行的选择。。 可以一次选择后使用快捷键注释掉。 如下图显示一次性注释掉多行。 如果需要取消连续行的注释的话,就选择已经注释掉的行,再次输入 Ctrl+/ 就可以了。 上面图显示的是快注释中的前后。 在第一张大图中,显示的通常是在 Java 中作为文档来使用的。 大部分情况下,使用行注释的可能频率更高一些。   https://www.ossez.com/t/intellij-idea-java/13681

2021年08月12日 0Comments 729Browse 0Like Read more
Computer Science

Java Arrays.asList 和 new ArrayList(Arrays.asList()) 的对比

英文标题【Arrays.asList vs new ArrayList(Arrays.asList())】 概述 在本文章中,我们会对 Arrays.asList(array) 和 ArrayList(Arrays.asList(array)) 之间的区别进行一些对比。 Arrays.asList 首先我们对 Arrays.asList 方法进行一些查看和说明。你可以单击上面的链接查看官方的 API。 通过 API 的文档我们可以了解到,使用这个方法将会为数组创建一个固定长度(fixed-size)List 对象。这个方法只是对 array 数组进行了一次包装,以便于在程序中可以使用 List,在这个包装中没有数据被拷贝或者创建。 同时,我们也不能对新创建的 List 的长度进行修改,因为添加或者删除 List 中的元素是不被允许的。 然而,我们是可以对新创建的 List 中的数组中的元素进行修改的。需要注意的是,如果你对 List 中的元素数据进行了修改的话,那么对应 Array 的数据也被改动了。 例如,考察下面的代码,我们首先创建了一个数组,然后将数组包装成了 List ,然后我们再对包装成 List 后的一个元素进行了修改。 String[] stringArray = new String[]{"A", "B", "C", "D"}; List<String> stringList = Arrays.asList(stringArray); 现在我们对包装后的的 List 的一个元素进行修改。 stringList.set(0, "E"); assertThat(stringList).containsExactly("E", "B", "C", "D"); assertThat(stringArray).containsExactly("E", "B", "C", "D"); stringList.add("F"); 从输出中,我们可以看到,我们修改 List 后,原始的 Array 也被修改了。 现在我们 List 和 Array 中的元素和顺序都是完全一样的。 现在我们尝试向包装后的 stringList 中插入一个新的元素。 stringList.add("F"); 抛出的异常: java.lang.UnsupportedOperationException at java.base/java.util.AbstractList.add(AbstractList.java:153) at java.base/java.util.AbstractList.add(AbstractList.java:111) 通过上面的代码我们可以看到,这个时候如果你对 List 进行元素插入或者删除的时候,程序将会抛出 java.lang.UnsupportedOperationException 异常。 ArrayList(Arrays.asList(array)) 与 Arrays.asList 方法一样,我们还可以使用 ArrayList<>(Arrays.asList(array)) 来从 Array 创建一个 List。 但是,与上面的方法不一样的是,使用这个方法创建的 List 是一个从老的 Array 中数据拷贝过来的,这个新的 List 与老的 Array 不相干,对新 List 中数据的操作不会影响到老的 Array 中的数据。 换句话说,使用这种方法创建的 List 是可以对 List 中的元素进行添加和删除操作的。 String[] stringArray = new String[]{"A", "B", "C", "D"}; List<String> stringList = new ArrayList<>(Arrays.asList(stringArray)); 现在我们对创建后的新 List 中的一个元素进行修改操作。 stringList.set(0, "E"); assertThat(stringList).containsExactly("E", "B", "C", "D"); 现在,我们再查看下 List 和 Array 数据中的区别。 assertThat(stringArray).containsExactly("A", "B", "C", "D"); 从上面的输出可以看到,老的 Array 中的数据没有被修改。 你可以访问 JDK source code 中的内容查看下源代码。 我们可以从源代码中看到 Arrays.asList 返回 ArrayList 的类型和 从 java.util.ArrayList 中返回的类型是不一样的。 主要的不同就是 Arrays.asList 返回的 ArrayList 只对老的 Array 进行了包装,没有实现 add 和 remove 方法。 结论 本文章中的实验主要对上面 2 种将数组转换为 List 的方法进行了对比。     主要不同的地方就是在于是否能够对转换后的数组进行元素的添加和删除等常规操作。   https://www.ossez.com/t/java-arrays-aslist-new-arraylist-arrays-aslist/13680

2021年08月12日 0Comments 664Browse 0Like Read more
Computer Science

Maven 项目执行的时候提示 JAVA_HOME is not correctly set 错误

提示的错误信息如下: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:2.9.1:jar (attach-javadocs) on project codebank: MavenReportException: Error while creating archive: Unable to find javadoc command: The environment variable JAVA_HOME is not correctly set. -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException 如下图:     问题和解决 上面的提示已经比较清楚了。 你没有在你的环境变量中设置 JAVA_HOME 需要按照上面的设置一个环境变量。 如果你使用的是 IEDA 的话,你需要重启的 IDEA 环境。 如果你使用的是命令行工具的话,你也需要退出后重启。 然后再次进行编译,应该就能解决上面的问题了。   https://www.ossez.com/t/maven-java-home-is-not-correctly-set/13679

2021年08月12日 0Comments 811Browse 0Like Read more
Computer Science

Druid 加载 Kafka 流数据的性能配置参数 TuningConfig

tuningConfig 的配置是可选的,如果你不在这里对这个参数进行配置的话,Druid 将会使用默认的配置来替代。   5-Best-Practices-for-Proactive-Database-V21500×700 15.5 KB   字段(Field) 类型(Type) 描述(Description) 是否必须(Required) type String 索引任务类型, 总是 kafka。 Y maxRowsInMemory Integer 在持久化之前在内存中聚合的最大行数。该数值为聚合之后的行数,所以它不等于原始输入事件的行数,而是事件被聚合后的行数。 通常用来管理所需的 JVM 堆内存。 使用 maxRowsInMemory * (2 + maxPendingPersists) 来当做索引任务的最大堆内存。通常用户不需要设置这个值,但是也需要根据数据的特点来决定,如果行的字节数较短,用户可能不想在内存中存储一百万行,应该设置这个值。 N(默认=1000000) maxBytesInMemory Long 在持久化之前在内存中聚合的最大字节数。这是基于对内存使用量的粗略估计,而不是实际使用量。通常这是在内部计算的,用户不需要设置它。 索引任务的最大内存使用量是 maxRowsInMemory * (2 + maxPendingPersists) N(默认=最大JVM内存的 1/6) maxRowsPerSegment Integer 聚合到一个段中的行数,该数值为聚合后的数值。 当 maxRowsPerSegment 或者 maxTotalRows 有一个值命中的时候,则触发 handoff(数据存盘后传到深度存储), 该动作也会按照每 intermediateHandoffPeriod 时间间隔发生一次。 N(默认=5000000) maxTotalRows Long 所有段的聚合后的行数,该值为聚合后的行数。当 maxRowsPerSegment 或者 maxTotalRows 有一个值命中的时候,则触发handoff(数据落盘后传到深度存储), 该动作也会按照每 intermediateHandoffPeriod 时间间隔发生一次。 N(默认=unlimited) intermediatePersistPeriod ISO8601 Period 确定触发持续化存储的周期 N(默认= PT10M) maxPendingPersists Integer 正在等待但启动的持久化过程的最大数量。 如果新的持久化任务超过了此限制,则在当前运行的持久化完成之前,摄取将被阻止。索引任务的最大内存使用量是 maxRowsInMemory * (2 + maxPendingPersists) 否(默认为0,意味着一个持久化可以与摄取同时运行,而没有一个可以进入队列) indexSpec Object 调整数据被如何索引。详情可以见 IndexSpec 页面中的内容 N indexSpecForIntermediatePersists 定义要在索引时用于中间持久化临时段的段存储格式选项。这可用于禁用中间段上的维度/度量压缩,以减少最终合并所需的内存。但是,在中间段上禁用压缩可能会增加页缓存的使用,而在它们被合并到发布的最终段之前使用它们,有关可能的值。详情可以见 IndexSpec 页面中的内容。 N(默认= 与 indexSpec 相同) reportParseExceptions Boolean 已经丢弃(DEPRECATED)。如果为true,则在解析期间遇到的异常即停止摄取;如果为false,则将跳过不可解析的行和字段。将 reportParseExceptions 设置为 true 将覆盖maxParseExceptions 和 maxSavedParseExceptions 的现有配置,将maxParseExceptions 设置为 0 并将 maxSavedParseExceptions 限制为不超过1。 N(默认=false) handoffConditionTimeout Long 段切换(持久化)可以等待的毫秒数(超时时间)。 该值要被设置为大于0的数,设置为0意味着将会一直等待不超时。 N(默认=0) resetOffsetAutomatically Boolean 控制当Druid需要读取Kafka中不可用的消息时的行为,比如当发生了 OffsetOutOfRangeException 异常时。 如果为false,则异常将抛出,这将导致任务失败并停止接收。如果发生这种情况,则需要手动干预来纠正这种情况;可能使用 重置 Supervisor API 。此模式对于生产非常有用,因为它将使您意识到摄取的问题。如果为true,Druid将根据 useEarliestOffset 属性的值(true 为 earliest ,false 为 latest )自动重置为Kafka中可用的较早或最新偏移量。请注意,这可能导致数据在您不知情的情况下被丢弃 (如果useEarliestOffset 为 false )或 重复 (如果 useEarliestOffset 为 true )。消息将被记录下来,以标识已发生重置,但摄取将继续。这种模式对于非生产环境非常有用,因为它将使Druid尝试自动从问题中恢复,即使这些问题会导致数据被安静删除或重复。该特性与Kafka的 auto.offset.reset 消费者属性很相似 N(默认=false) workerThreads Integer supervisor 用于为工作任务处理 请求/相应(requests/responses)异步操作的线程数。 N(默认=min(10, taskCount)) chatThreads Integer 与索引任务的会话线程数。 N(默认=10, taskCount * replicas)) chatRetries Integer 在任务没有响应之前,将重试对索引任务的HTTP请求的次数 N(默认=8) httpTimeout ISO8601 Period 索引任务的 HTTP 响应超时的时间。 N(默认=PT10S) shutdownTimeout ISO8601 Period supervisor 尝试无故障的停掉一个任务的超时时间。 N(默认=PT80S) offsetFetchPeriod ISO8601 Period supervisor 查询 Kafka 和索引任务以获取当前偏移和计算滞后的频率。 N(默认=PT30S,min == PT5S) segmentWriteOutMediumFactory Object 创建段时要使用的段写入介质。更多信息见下文。 N (默认不指定,使用来源于 druid.peon.defaultSegmentWriteOutMediumFactory.type 的值) intermediateHandoffPeriod ISO8601 Period 段发生切换的频率。当 maxRowsPerSegment 或者 maxTotalRows 有一个值命中的时候,则触发handoff(数据存盘后传到深度存储), 该动作也会按照每 intermediateHandoffPeriod 时间间隔发生一次。 N(默认=P2147483647D) logParseExceptions Boolean 如果为 true,则在发生解析异常时记录错误消息,其中包含有关发生错误的行的信息。 N(默认=false) maxParseExceptions Integer 任务停止接收之前可发生的最大分析异常数。如果设置了 reportParseExceptions ,则该值会被重写。 N(默认=unlimited) maxSavedParseExceptions Integer 当出现解析异常时,Druid可以跟踪最新的解析异常。"maxSavedParseExceptions"决定将保存多少个异常实例。这些保存的异常将在 任务完成报告 中的任务完成后可用。如果设置了reportParseExceptions ,则该值会被重写。 N(默认=0)   https://www.ossez.com/t/druid-kafka-tuningconfig/13672

2021年08月12日 0Comments 642Browse 0Like Read more
Computer Science

Druid 加载 Kafka 流数据的 索引属性(IndexSpec)

下面的表格主要对加载 Kafka 流数据的索引属性进行参数描述。     字段(Field) 类型(Type) 描述(Description) 是否必须(Required) bitmap Object 针对 bitmap indexes 使用的是压缩格式。应该是一个 JSON 对象,请参考 Bitmap types 来了解更多 N(默认=Roaring) dimensionCompression String 针对维度(dimension)列使用的压缩算法,请从 LZ4, LZF,或者 uncompressed 中选择。 N(默认= LZ4) metricCompression String 针对主要类型 metric 列使用的压缩算法,请从 LZ4, LZF,或者 uncompressed 中选择。 N(默认= LZ4) longEncoding String 类型为 long 的 metric 列和 维度(dimension)的编码格式。从 auto 或 long 中进行选择。auto 编码是根据列基数使用偏移量或查找表对值进行编码,并以可变大小存储它们。longs 将会按照,每个值 8 字节来进行存储。 N(默认= longs) https://www.ossez.com/t/druid-kafka-indexspec/13673

2021年08月12日 0Comments 757Browse 0Like Read more
Computer Science

Nvm 安装新的 nodejs 版本

在使用 nvm 安装新的 nvm 版本之前,请确定你的操作系统中已经安装了 nvm。 安装的方法,请访页面:Windows 中 Node.js 中 nvm 的安装配置和使用 中的内容。 安装新版本 假设我们需要安装的新版本为 8.9.4,那么你需要执行命令 nvm install 8.9.4。     只需要等待一会就可以看到新的 nodejs 被安装成功了。 通过执行命令 nvm ls 来查看你的计算机中装了几个版本的 nodejs。     切换版本 对版本进行切换使用的命令为: nvm use 8.9.4 随后再可以使用 node -v 来查看当前系统中使用的 node 的版本。     至此,我们使用 nvm 对版本的安装和切换就已经完成了。   https://www.ossez.com/t/nvm-nodejs/13669

2021年08月11日 0Comments 836Browse 0Like Read more
1…128129130131132…304
Archives
  • June 2026
  • May 2026
  • April 2026
  • March 2026
  • February 2026
  • January 2026
  • December 2025
  • November 2025
  • October 2025
  • September 2025
  • August 2025
  • July 2025
  • June 2025
  • May 2025
  • April 2025
  • March 2025
  • February 2025
  • January 2025
  • December 2024
  • November 2024
  • October 2024
  • September 2024
  • August 2024
  • July 2024
  • June 2024
  • May 2024
  • April 2024
  • March 2024
  • February 2024
  • January 2024
  • December 2023
  • November 2023
  • October 2023
  • September 2023
  • August 2023
  • July 2023
  • June 2023
  • May 2023
  • April 2023
  • December 2022
  • November 2022
  • October 2022
  • September 2022
  • August 2022
  • May 2022
  • April 2022
  • March 2022
  • February 2022
  • January 2022
  • December 2021
  • November 2021
  • October 2021
  • September 2021
  • August 2021
  • July 2021
  • June 2021
  • May 2021
  • April 2021
  • March 2021
  • February 2021
  • January 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • August 2020
  • July 2020
  • June 2020
  • May 2020
  • April 2020
  • March 2020
  • February 2020
  • January 2020
  • December 2019
  • November 2019
  • October 2019
  • September 2019
  • August 2019
  • July 2019
  • June 2019
  • May 2019
  • April 2019
  • March 2019
  • February 2019
  • January 2019
  • December 2018
  • November 2018
  • October 2018
  • September 2018
  • August 2018
  • July 2018
  • June 2018
  • May 2018
  • April 2018
  • March 2018
Categories
  • Computer Science (2,367)
    • Confluence (663)
    • Gradle (12)
  • U.S. (523)
  • 文化旅游 (146)

COPYRIGHT © 2020 CWIKIUS. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

湘ICP备2020018253号-1