浅谈 Java 9 的模块化系统

什么是模块?

一个模块是代码的集合。它以依赖关系的形式持有类,数据和其他模块。它与JAR文件类似,但更好。每个模块都包含一个module-info.java文件,它可以让我们明确地设置必要的信息。包括它依赖的其他模块以及其他模块可以访问的内容。
这是一种更好的方式,可以为程序员共享代码并进行协作减少一些兼容性的问题。

如何使用模块?

一个模块包含一个module-info.java文件 ,它包含了模块的基本信息,比如它依赖哪些模块、它的哪些部分能被其他模块访问等。
最主要的关键词是requiresexports
现在,我们来写举几个简单的例子:

module Decoder {
 
  requires Reader;
  exports com.decoder;
 
}

上面的这个例子表明了Decoder模块依赖于Reader模块。
下一行则声明其他模块只能访问com.decoder包以内的内容。

module Reader {

  exports org.reader;
}

这个例子声明Reader模块不依赖于别的模块,
其他模块只能访问org.reader包以内的内容。

下面两个类分别位于Reader模块和Decoder模块。
Decoder模块通过Reader模块的Scanner类来读取内容。

org/reader/Scanner.java:

package org.reader;

public class Scanner {
  public static String read() {
    return "这是一段文本";
  }
}

com/decoder/Main.java:

package com.decoder;

import org.reader.Scanner;

public class Main {
  public static void main(String[] args) {
    System.out.format("从Scanner中读取到: %s %n", Scanner.read());
  }
}

模块系统的特性

  • 提高安全性,模块系统可以让我们隐藏那些我们不想暴露出来的类,具有极高的封闭性。
  • 提高项目的可维护性。修改一个模块内的代码不会影响到其他的模块。当你把项目分成许多个模块之后,你只需要重新编译改动的模块,而不再需要重新编译整个项目。
  • 更加容易地测试。

参考资料

Java 9 Modularity explained in 5 minutes

使用lss233源加快Minecraft插件/Mod开发

记得最开始使用Maven的时候,基本上大部分时间都花在寻找依赖和下载依赖上。
许多API的作者也都是把自己的工件放在自己的maven仓库上,
如果你使用maven,那么你不仅要在pom.xml中写dependency,还要写一个repository。
有些仓库在国内访问还很慢,这大大降低了开发效率。

如果你现在正为此苦恼的话,那么试试我搭建的仓库吧!

介绍

仓库地址:https://lss233.com/artifactory/minecraft

这个仓库镜像了以下内容:

  • Spigot的Snapshots (主要包含了spigot-api, bukkit-api)
  • Spongepowered (主要包含了spongeapi, spongecommon, spongeforge 以及其他开发sponge插件可能用到的工件)
  • forge(镜像了files.minecraftforge.net/maven)
  • nexus.hc.to(主要包含了vault-api, heroes, Residence等工件)
  • placeholderapi-repo(主要包含了PlaceholderAPI)
  • sk89q-repo (主要包含了worldedit, worldguard, craftbook,dynmap-api 等工件 )
  • dmulloy2-snapshots(主要包含了ProtocolLib等工件)
  • ess3-repo (主要包含了Essentials插件的一些工件)
  • dakanilabs-repo (主要包含了SQLibrary, PlayerPoints等一些工件)
  • kk-central (主要包含了KCauldron等一些工件)
  • Phoenix(主要包含了PhoenixAPI)
  • destroystokyo-repo(主要包含paper-api, paperclip, waterfall等工件)
  • lex-snapshots(主要包含了NeptuneLib)
  • sonatype(主要包含了bungeecord-api等一大堆工件)

使用方法

对于Maven

打开pom.xml ,在
<repositories> ... </repositories>代码块中加入:

<repository>
  <id> lss233-minecraft </id>
  <name> Lss233's Minecraft Repository </name>
  <url>https://lss233.com/artifactory/minecraft</url>
</repository>

然后就可以把其他已经在本仓库中的<repository> ... </repository>删除了。

使用Gradle进行Forge mod开发

把build.gradle里

maven {
            name = "forge"
            url = "http://files.minecraftforge.net/maven"
        }

替换成

maven {
            name = "forge"
            url = "https://lss233.com/artifactory/minecraft"
        }

就可以通过本仓库下载ForgeGradle等工件。

另外,你也可以把
jcenter()换成

maven {
            name = "jcenter"
            url = "https://lss233.com/artifactory/jcenter"
        }

加快其他工件的下载。

对于啥都不用的小伙伴

你可以用浏览器直接打开本仓库的网址,自行寻找你想要的工件。


如果您有什么需要补充的仓库,或者想要提交自己的工件,请在这里反馈。

Ghost Alpha主题发布

Ghost Alpha 是本人为Ghost写的第一个主题,前端主要采用Vue编写,主题基于来自HTML5 UP的Alpha

安装

您可以在Github的Release页面下载这个主题的最新版本。
解压下载的.zip文件,将里面的文件粘贴至您Ghostcontent/themes文件夹中,然后重启您的Ghost

您需要在GhostLabs中开启Public API

配置

您可以在这个主题的assets/js文件夹下找到一个名为config.js的文件,将里面的值换成你自己的。

更新日志

  • 2018/6/22 发布第一个测试版本

这个主题目前还在开发阶段,您可以在评论区或者Github的issues页面提交您发现的问题或者建议。

{0x00} Phoenix模块开发教程:准备阶段

Phoenix是使用Java进行开发的插件框架,因此,标准的Phoenix插件也需要使用Java进行开发。
在进行Java开发之前,我们需要准备好JDKIDE.

0x01 准备JDK

这篇文章属于Phoenix Framework 入门教程的一部分。

Java Development Kit,就是我们平时所提到 JDK,是开发 Phoenix模块所必须的。

由于Phoenix使用了Java8进行编写,因此你只能选择Java8或其以上的JDK版本。
同时,要想正常使用Phoenix,你也必须使用Java8或其以上版本的JRE. 旧版本的Java(如Java7)是无法运行Phoenix的。

下载

访问Oracle的Java SE Development Kit 8 Downloads页面,你可以下载到最新版本的Oracle JDK8.
让我们翻到下面的Java SE Development Kit 8u***,这里提供了各种平台的下载地址。

在下载Oracle的Java之前,你需要同意并遵守他们的协议,即《Oracle Binary Code License Agreement for the Java SE Platform Products and JavaFX》。
选中Accept License Agreement表示你同意协议,然后在下面的表格中找到适合你系统的JDK安装包,点击下载。

举个例子,如果你是Windows 10,并且是x64的系统,那么可以下载Windows x64对应的那一项。

白痴环节

如何知道自己的系统是64位还是32位?百度搜索那句话就好了!

安装

...等待编辑。

0x02 准备IDE

IDE是集成开发环境的简称,一个集成开发环境为开发者提供了许多在开发过程中需要用到的实用功能。
Java的集成开发环境有很多,比如IntelliJ IDEA,Eclipse,NetBeans等等...
这里简单介绍一下IntelliJ IDEA
IntelliJ IDEA是一个非常棒的IDE,关于它的安装教程,网络上已经有了一些很好的教程。

推荐阅读: 【工具安装和配置】IntelliJ IDEA安装

{0x12} Phoenix模块开发教程:创建你的项目主类

现在,我们终于可以开始写代码啦!

这篇文章属于Phoenix Framework 入门教程的一部分。

创建主类

在IntelliJ IDEA的Project窗口中,右键java文件夹(它应该是 src > main > java)

单击 New > Java Class

Create New Class窗口中,
Name处填写你的类名。
还记得上一节中我们填写的Group IdArtifact Id吗?
你的类名最好这样填: <Group Id>.<Artifact Id>.<Mod Id>Module
Create-New-Class_051

当你创建好你的主类后,你的主类必须有 PhoenixModule 这个注解(Annotation)。这个注解能够让 Phoenix 找到你的主类。
另外,你的主类还需要继承Module这个类,这样Phoenix才能正确调用它。
下面是一个例子:

package com.lss233.tutorial;


import com.lss233.phoenix.module.Module;
import com.lss233.phoenix.module.PhoenixModule;

@PhoenixModule(modid = "mymod", name = "My First Phoenix Module", version = "1.0.0")
public class TutorialModule extends Module{
    @Override
    public void onInitial() {

    }

    @Override
    public void onEnable() {

    }

    @Override
    public void onDisable() {

    }
}

下面,我们来看看刚刚写了什么。

PhoenixModule注解

@PhoenixModule(...) 在Java中表示一个注解(Annotation)。

拓展阅读: 框架开发之Java注解的妙用

咱的这个注解向Phoenix简单介绍了一下你的模块,它的所有参数如下:

名字 描述 例子
modid 必填.你的Mod Id,这个Id必须独一无二,否则会出现冲突的情况. mymod
name 必填. 你的模块名字,主要是给使用者看的. My First Module
version 必填. 你的模块版本. 1.0.0-SNAPSHOT

Module类

注意到了吗,我们的TutorialModule类继承了Module类
这个类是一个抽象类,它会要求继承他的子类实现下面几个方法。

onInitial()

在模块被初始化时,该方法会被调用。这个时候你可以初始化一些相关配置、数据库等,以便将来调用。

onEnable()

在模块被启用时,该方法会被调用。这个时候,所有能使用的模块都已经被初始化完毕了。你可以在此时与其他模块相互连接、监听事件、注册命令等。

onDisable()

在模块被禁用时,该方法会被调用。你可以在此时进行收尾工作,比如保存配置文件、断开数据库连接、说再见等。

总结

到了目前为止,你已经成功创建了一个能够被Phoenix框架加载的模块。
可以说,你已经成功写出了一个Hello World了。

1 / 5 下一页 →

立刻订阅 Lss233's.Blog()

保持最新! 将所有最新和最棒的帖子直接发送到您的邮箱

或者订阅 我们的RSS!