问题描述
我对使用 ServiceLoader 还很陌生,我正在尝试启动并运行一个非常简单的示例。
目前有 4 个模块:BLCore、BLInterface、BLMod1、BLMod2
BLCore depends on: BLInterface,BLMod1,BLMod2
BLInterface depends on: Nonne
BLMod1 depends on: BLInterface
BLMod2 depends on: BLInterface
import java.util.ServiceLoader;
public class Main {
public static void main(String[] args) {
for(BeanInterface val : ServiceLoader.load(BeanInterface.class)){
System.out.println("You are a "+val.getName());
}
}
}
而且 BLInterface 有一个 String 方法,它只打印出一个名字左右。
结构如下:
代码可以编译但是ServiceLoader没有检测到Module1和Module2,有什么想法吗?
解决方法
您应该使用包而不是默认包。例如BLMod1
。
在 Java 8 中(排除由模块引起的问题):
- 在
META-INF/services/com.example.BeanInterface
项目中,com.example.Module1
必须包含BLMod2
- 在
META-INF/services/com.example.BeanInterface
项目中,com.example.Module2
必须包含BLCore
- 在
BLMod1
配置(Maven、Gradle 甚至您的 IDE)中,您必须确保引用BLMod2
和Module1
:当您执行您的主要的。 - 确保
Module2
和module-info.java
具有公共构造函数。
如果您使用的是 Java 9++,您可能还需要在 module com.example.module1 {
provides com.example.BeanInterface
with com.example.Module1;
}
中添加适当的行:
import discord
from discord.ext import commands
class voice(commands.Cog):
def __init__(self,client):
self.client = client
@commands.Cog.listener()
async def on_voice_state_update(self,member,before,after):
channel = before.channel or after.channel
if channel.id == Channel_ID:
if before.channel is None and after.channel is not None: # Member joins the defined channel
role = discord.utils.get(member.guild.roles,id=Role_ID)
await member.add_roles(role) # Role is given
elif before.channel is not None and after.channel is None:
role = discord.utils.get(member.guild.roles,id=Role_ID)
await member.remove_roles(role) # Role removed because he left the channel
def setup(client):
client.add_cog(voice(client))
这就是包的用处:如果没有合适的包,您可能无法使用模块。
您可能还想阅读 Javadoc:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/ServiceLoader.html