2015-08-10 3 views
0

Я получаю ошибку инициализации, когда пытаюсь создать экземпляр своего графика в чертежах. Вот код, который я использую для создания нового графика:Tilt's IllegalArgumentException при создании графика

String path = "conf/titan-cassandra-" + System.getProperty("env") + ".properties"; 
Graph graph = TitanFactory.open(path); 

Системное свойство задано и файл существует. Ошибка бросают в TitanFactory:

final Pattern p = Pattern.compile("(" + 
Pattern.quote(GraphDatabaseConfiguration.STORAGE_NS.getName()) + "\\..*" + "(" + 
Pattern.quote(GraphDatabaseConfiguration.STORAGE_DIRECTORY.getName()) + "|" + 
Pattern.quote(GraphDatabaseConfiguration.STORAGE_CONF_FILE.getName()) + ")" + "|" + 
Pattern.quote(GraphDatabaseConfiguration.INDEX_NS.getName()) + "\\..*" + "(" + 
Pattern.quote(GraphDatabaseConfiguration.INDEX_DIRECTORY.getName()) + "|" + 
Pattern.quote(GraphDatabaseConfiguration.INDEX_CONF_FILE.getName()) + ")" + ")"); 

Оценка «нулевой» экспрессии GraphDatabaseConfiguration.STORAGE_NS дает. Почему это может быть?

Edit:

я в том числе трассировку стека, а

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.commons.lang.StringUtils.containsAny(Ljava/lang/String;[C)Z 
    at com.thinkaurelius.titan.diskstorage.configuration.ConfigElement.<init>(ConfigElement.java:26) 
    at com.thinkaurelius.titan.diskstorage.configuration.ConfigNamespace.<init>(ConfigNamespace.java:19) 
    at com.thinkaurelius.titan.diskstorage.configuration.ConfigNamespace.<init>(ConfigNamespace.java:24) 
    at com.thinkaurelius.titan.graphdb.configuration.GraphDatabaseConfiguration.<clinit>(GraphDatabaseConfiguration.java:81) 
    at com.thinkaurelius.titan.core.TitanFactory.getLocalConfiguration(TitanFactory.java:240) 
    at com.thinkaurelius.titan.core.TitanFactory.getLocalConfiguration(TitanFactory.java:170) 
    at com.thinkaurelius.titan.core.TitanFactory.open(TitanFactory.java:61) 
    at io.fama.api.service.GraphHolder.populateGraph(GraphHolder.java:28) 
    at io.fama.api.service.GraphHolder.graph(GraphHolder.java:21) 
    at io.fama.api.DebugTests.main(DebugTests.java:7) 

Когда специалист работает тест он бросает другую ошибку. Кажется, это связано с зависимостями.

+0

Что решает ваш System.getProperty («env»)? – Catch44

+0

dev, test или prod в зависимости от моей среды. Я выполняю некоторые тесты, поэтому это «тест»; относительный путь - conf/titan-cassandra-test.properties. – cscan

+0

Предоставляет ли это трассировку стека любого типа или просто исключение без какой-либо другой информации? – Catch44

ответ

1

Вы не указали трассировку стека, но она легко воспроизводится из оболочки Гремлина. При запуске gremlin.sh обычно лучше запускать его из каталога $ TITAN_HOME, а не $ TITAN_HOME/bin.

gremlin> graph = TitanFactory.open('conf/titan-cassandra-test.properties') 
Backend shorthand unknown: conf/titan-cassandra-test.properties 
Display stack trace? [yN] y 
java.lang.IllegalArgumentException: Backend shorthand unknown: conf/titan-cassandra-test.properties 
    at com.google.common.base.Preconditions.checkArgument(Preconditions.java:120) 
    at com.thinkaurelius.titan.core.TitanFactory.getLocalConfiguration(TitanFactory.java:175) 
    at com.thinkaurelius.titan.core.TitanFactory.open(TitanFactory.java:61) 

Вам необходимо следить за относительным путем. Скорее всего, вы запускаете программу из другого каталога, так что относительный путь к файлу свойств не разрешается. Либо запустите программу из правильного родительского каталога, либо используйте абсолютный путь.

+0

@cscan Спасибо за добавление трассировки стека. Этот ответ не применяется. –

+0

Оказывается, были две проблемы: одна из неправильной версии включенной зависимости, а другая - то, что maven запускал код с другого пути. – cscan

0

Ваше исключение приводит к этой строке кода:

Preconditions.checkArgument(!StringUtils.containsAny(name, ILLEGAL_CHARS),"Name contains illegal character: %s (%s)",name,ILLEGAL_CHARS); 

Мы можем видеть в недопустимые символы декларации:

public static final char[] ILLEGAL_CHARS = new char[]{SEPARATOR,' ','\t','#','@','<','>','?','/',';','"','\'',':','+','(',')','*','^','`','~','$','%','|','\\','{','[',']','}'}; 

Эта строка в конструкторе ConfigElement (строка 18) абстрактный класс предотвращает попадание любого из следующих символов в путь.

Tabs, New Line characters, # @ < > ?/; " ' : + () *^` ~ $ % | \ { [ ] } and the . 

Таким образом, проблема не является проблемой абсолютного/относительного пути.

Однако ошибка, которую вы получаете, связана с методом .containsAny на StringUtils. Из того, что я могу собрать, это вызывает эту ошибку, потому что Preconditions checkState methods (строка 172) не имеет действительного вызова для all four of the parameters given. (строка 26). Это заставляет меня поверить, что вы получите эту ошибку, потому что никакая проверка не может быть выполнена, поскольку никакой метод не доступен для использования.

я нашел this полезно, потому что это помогло мне понять, что

Ljava/lang/String;[C)Z 

В конце первой строки вашего стека-следа конкретно имел в виду. В пакете StringUtils, который этот пакет Titan не пытается вызвать, не существует никакого метода, и он будет генерировать этот NoSuchMethodError до тех пор, пока не будет определен метод, который обрабатывает все четыре параметра.