清单 4. Jeeves 实现了 IPersonalServant
import java.io.*;
public class Jeeves
implements IPersonalServant
{
public void process(File f)
{
System.out.println("Very good, sir.");
}
public boolean can(String cmd)
{
if (cmd.equals("fetch tea"))
return true;
else
return false;
}
}
public class Jeeves
implements IPersonalServant
{
public void process(File f)
{
System.out.println("Very good, sir.");
}
public boolean can(String cmd)
{
if (cmd.equals("fetch tea"))
return true;
else
return false;
}
}
剩下的就是配置包含实现的 JAR 文件,让 ServiceLoader 能识别 — 这可能会非常棘手。JDK 想要 JAR 文件有一个 META-INF/services 目录,它包含一个文本文件,其文件名与接口类名完全匹配 — 本例中是 META-INF/services/IPersonalServant。接口类名的内容是实现的名称,每行一个,如清单 5:
清单 5. META-INF/services/IPersonalServant
Jeeves # comments are OK
幸运的是,Ant 构建系统(自 1.7.0 以来)包含一个对 jar 任务的服务标签,让这相对容易,见清单 6:
清单 6. Ant 构建的 IPersonalServant
<target name="serviceloader" depends="build">
<jar destfile="misc.jar" basedir="./classes">
<service type="IPersonalServant">
<provider classname="Jeeves" />
</service>
</jar>
</target>
<jar destfile="misc.jar" basedir="./classes">
<service type="IPersonalServant">
<provider classname="Jeeves" />
</service>
</jar>
</target>