Вы можете использовать adb для удаления примера предыдущей версии:
adb -s $device uninstall ${packageName}.debug
adb -s $device uninstall "com.bookings.test"
подключенное к устройству устройство packageName - имя пакета приложения.
Надеюсь, это поможет:)
Они - то же самое... rmiregistry
отдельная программа, которую можно запустить из командной строки или сценария, в то время как LocateRegistry.createRegistry
делает то же самое программно.
, По моему опыту, для "реальных" серверов Вы захотите использовать rmiregistry
так, чтобы Вы знали, что это всегда работает независимо от того, запускается ли клиентское приложение. createRegistry
очень полезно для тестирования, поскольку можно запустить и остановить реестр от теста по мере необходимости.
При использовании Spring для экспорта сервисов RMI, он автоматически запускает реестр, если Вы уже не работаете. См. RmiServiceExporter
Если бы Вы пишете автономное JAVA-приложение, Вы хотели бы запустить свой собственный rmiregistry, но если Вы пишете приложение J2EE, которое, очевидно, работает в контейнере J2EE тогда, Вы хотите к "LocateRegistry", поскольку уже существует одна работа сервера приложений!
Если мы сначала запустим rmiregistry, RmiServiceExporter зарегистрируется в запущенном rmiregistry. В этом случае мы должны установить для системного свойства java.rmi.server.codebase значение, в котором можно найти класс org.springframework.remoting.rmi.RmiInvocationWrapper_Stub. В противном случае RmiServiceExporter не будет запущен и получит исключение " ClassNotFoundException класс не найден: org.springframework.remoting.rmi.RmiInvocationWrapper_Stub; вложенное исключение: ... "
Если ваш rmi-сервер, rmi-клиент и rmiregistry могут обращаться к одной и той же файловой системе, вы можете захотеть, чтобы системное свойство было автоматически сконфигурировано так, чтобы в общей файловой системе можно было найти spring.jar. Следующие служебные классы и конфигурация Spring показывают, как этого можно достичь.
abstract public class CodeBaseResolver {
static public String resolveCodeBaseForClass(Class<?> clazz) {
Assert.notNull(clazz);
final CodeSource codeSource = clazz.getProtectionDomain().getCodeSource();
if (codeSource != null) {
return codeSource.getLocation().toString();
} else {
return "";
}
}
}
public class SystemPropertyConfigurer {
private Map<String, String> systemProperties;
public void setSystemProperties(Map<String, String> systemProperties) {
this.systemProperties = systemProperties;
}
@PostConstruct
void init() throws BeansException {
if (systemProperties == null || systemProperties.isEmpty()) {
return;
}
for (Map.Entry<String, String> entry : systemProperties.entrySet()) {
final String key = entry.getKey();
final String value = SystemPropertyUtils.resolvePlaceholders(entry.getValue());
System.setProperty(key, value);
}
}
}
<bean id="springCodeBase" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="staticMethod" value="xx.CodeBaseResolver.resolveCodeBaseForClass" />
<property name="arguments">
<list>
<value>org.springframework.remoting.rmi.RmiInvocationWrapper_Stub</value>
</list>
</property>
</bean>
<bean id="springCodeBaseConfigurer" class="xx.SystemPropertyConfigurer"
depends-on="springCodeBase">
<property name="systemProperties">
<map>
<entry key="java.rmi.server.codebase" value-ref="springCodeBase" />
</map>
</property>
</bean>
<bean id="rmiServiceExporter" class="org.springframework.remoting.rmi.RmiServiceExporter" depends-on="springCodeBaseConfigurer">
<property name="serviceName" value="XXX" />
<property name="service" ref="XXX" />
<property name="serviceInterface" value="XXX" />
<property name="registryPort" value="${remote.rmi.port}" />
</bean>
В приведенном выше примере показано, как свойство системы устанавливается автоматически только тогда, когда сервер rmi, клиент rmi и реестр rmi могут получить доступ к одной и той же файловой системе. Если это не так или spring база кода используется другим способом (например, HTTP), вы можете изменить CodeBaseResolver в соответствии со своими потребностями.