Ich erstelle eine allgemeine Bibliothek und möchte einen Dienst hinzufügen, der ServletContext
verwendet. Aber da die Bibliothek auch in einer cli
Umgebung verwendet werden soll, muss ich einen Weg finden, dem Frühling zu sagen, das Servlet dort zu ignorieren.Wie füge ich die optionale Abhängigkeitsklasse im Frühling hinzu?
@Component
public class MyService {
//only available in a web environment
@Autowired(required = false)
private ServletContext servletContext;
}
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<optional>true</optional>
</dependency>
Im Einführungsprojekt möchte ich nur eine Befehlszeilenschnittstelle laufen, so dass ich nicht die Servlet-Abhängigkeit enthalten.
Aber wenn ich zu starten versuchen, die folgende Ausnahme beim Start ausgelöst wird: Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletContext
Frage: Wie kann ich die Verwendung der ServletContext
im CommonService
ohne hinzuzufügen, um die Abhängigkeit zu jedem Projekt zu machen, die das wieder verwendet Klasse?
Dies scheint korrekt zu sein: Wenn Ihre Klasse die 'ServletContext' Klasse importiert, muss sie im Klassenpfad sein, andernfalls wird eine Ausnahme ausgelöst. [Maven Dokumentation] (http://maven.apache.org/guides/introduction/introduction-toptional-and-excludes-dependencies.html) sagt: * Die Idee ist, dass einige der Abhängigkeiten nur für bestimmte Funktionen verwendet werden im Projekt, und wird nicht benötigt, wenn diese Funktion nicht verwendet wird *. Das Feature 'MyService' wird verwendet, da Spring es beim Start lädt, also ist es nicht das von Maven-Entwicklern beschriebene Szenario, und ich schätze, Sie können das nicht tun. – BackSlash
Also wie könnte ich es umgehen? – membersound
Sie sollten es in eine Klasse stellen, die nicht vom Frühling geladen wird. Aber so würde die '@ Autowired' Annotation nicht funktionieren. Deshalb sagte ich, ich schätze, du kannst das nicht tun. Sie benötigen Felder, um Felder für Sie automatisch zu aktivieren, aber ohne die Annotation "@ Component" funktioniert es nicht und mit der Annotation "@ Component" erhalten Sie die "ClassNotFoundException". Sie könnten die '@ Component' entfernen und [diese Lösung] (https://Stackoverflow.com/a/24373710/1759845) verwenden, um die Abhängigkeit zu autowire, wenn die Klasse instanziiert wird, aber es ist eine Art schmutziger Hack. Außerdem können Sie MyService nicht mehr automatisch starten. – BackSlash