2016-12-13 6 views
0

Очень новый для java и был бы благодарен за указатель или два. Я создаю список массивов для частичного текста из моих git-коммитов. Я бег это заводной сценарий в ДженкинсУникальные экземпляры строки в ArrayList

def commits = sh script: """ git log ${previous_tag}..HEAD --oneline --decorate""", returnStdout: true 
def array = commits.split("\\n"); 

ArrayList<String> mystats = new ArrayList<>(array.length); 
for(int i =0; i < array.length; i++) { 
    Pattern pattern = Pattern.compile("^\\w{7}\\s(MYSTATS-|mystats-)"); 
    Matcher matcher = pattern.matcher(array[i]); 
    if(matcher.find()) { 
    mystats.add(array[i]) 
    } 
} 

То, что я хочу сделать, это создать еще один массив для хранения уникальных значений (так что ничего не дублировать) и были консультировали HashSet является лучшим подходом как он будет отвергать повторяющиеся значения

// Put all unique mystats matches into a set 
Set<String> mystats_set = new HashSet<String>(mystats.size()); 
for(int i =0; i < mystats.size(); i++) { 
    Pattern pattern = Pattern.compile("(MYSTATS-|mystats-)\\w+"); 
    Matcher matcher = pattern.matcher(mystats[i]); 
    if(matcher.find()) { 
    String id = matcher.group().toUpperCase().toString(); 
    def jira_json = sh script: '''curl --cert ../certs/dev_cert.p12:password https://jira.dev.organisation.co.uk:port_number/rest/api/2/issue/${id}''', returnStdout: true 
    mystats_set.add("[" + id + "](https://jira.dev.organisation.co.uk/browse/" + id + ")"); 
    } 
} 

Когда это работает, я получаю

java.io.NotSerializableException: java.util.regex.Matcher 
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860) 
at org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65) 
at org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56) 
at org.jboss.marshalling.MarshallerObjectOutputStream.writeObjectOverride(MarshallerObjectOutputStream.java:50) 
at org.jboss.marshalling.river.RiverObjectOutputStream.writeObjectOverride(RiverObjectOutputStream.java:179) 
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:344) 
at java.util.HashMap.internalWriteEntries(HashMap.java:1785) 
at java.util.HashMap.writeObject(HashMap.java:1362) 
at sun.reflect.GeneratedMethodAccessor202.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.jboss.marshalling.reflect.SerializableClass.callWriteObject(SerializableClass.java:271) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:976) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) 
at org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65) 
at org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56) 
at org.jboss.marshalling.MarshallerObjectOutputStream.writeObjectOverride(MarshallerObjectOutputStream.java:50) 
at org.jboss.marshalling.river.RiverObjectOutputStream.writeObjectOverride(RiverObjectOutputStream.java:179) 
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:344) 
at java.util.TreeMap.writeObject(TreeMap.java:2438) 
at sun.reflect.GeneratedMethodAccessor204.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.jboss.marshalling.reflect.SerializableClass.callWriteObject(SerializableClass.java:271) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:976) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988) 
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) 
at org.jboss.marshalling.AbstractObjectOutput.writeObject(AbstractObjectOutput.java:58) 
at org.jboss.marshalling.AbstractMarshaller.writeObject(AbstractMarshaller.java:111) 
at org.jenkinsci.plugins.workflow.support.pickles.serialization.RiverWriter.writeObject(RiverWriter.java:132) 
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:429) 
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:408) 
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:356) 
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$100(CpsThreadGroup.java:78) 
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:236) 
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:224) 
at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:47) 
at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:112) 
at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28) 
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745) 

Вызванный: исключение, которое произошло: в полевых местных в поле родителя в поле вызывающего в поле х в программе полевых в полевых потоках в объекте [email protected]

Так после некоторого чтение, кажется, что Set не является сериализуемый? Если это так, то как я могу просто иметь ArrayList, который содержит только уникальные значения и отклоняет повторяющиеся записи?

Любая помощь приветствуется

Спасибо

+0

не уверен, где произошел процесс сериализации или где сделал приложение пытался сериализовать 'Set', однако вы можете проверить arraylist на 'arraylist.contains (str)' перед добавлением его в arraylist, это что вам нужно? – Yazan

+0

Это не похоже на ядро ​​Java. Если вы используете groovy или scala (или что-то еще), то, пожалуйста, отметьте это соответствующим образом. И упомянутое исключение похоже, что вы пытаетесь сериализовать элементы коллекции, чтобы сохранить их в файле? Какая коллекция такова и почему она содержит «Matcher»? – Tom

+0

@tom, извинения, да используя groovy, добавленный тег, im, не пытающийся записать в файл, просто хочу иметь возможность использовать каждый элемент в наборе как переменную, например, строку интерполяции в Ruby – Richlewis

ответ

2

хорошо, после добавления полного StackTrace теперь оказывается, что Matcher является проблема, как ее не сериализуемым

вы проверили this?

я quoute:

вы заметили проблему:

java.io.NotSerializableException: java.util.regex.Matcher Это происходит потому, что сличитель локальная переменная имеет тип (Matcher) не рассматривается сериализуемым Java. Так как трубопроводы должны пережить Jenkins перезапускается, состояние запущенной программы периодически сохраняется на диске , поэтому его можно возобновить позже (сохранение происходит после каждого шага или в в середине таких шагов, как sh). ...

проверить ссылку для получения дополнительной информации пост предлагает использовать аннотацию @NonCPS для метода, который Matcher объявлен в.потому что я quoute снова:

Такой метод будет рассматриваться как «родной» двигателем трубопровода и ее локальные переменные не сохраняются

ех,

@NonCPS 
public void doSomeWork(){ 
    ArrayList<String> mystats = new ArrayList<>(array.length); 
    for(int i =0; i < array.length; i++) { 
     Pattern pattern = Pattern.compile("^\\w{7}\\s(MYSTATS-|mystats-)"); 
     Matcher matcher = pattern.matcher(array[i]); 
     if(matcher.find()) { 
      mystats.add(array[i]) 
     } 
    } 
} 

и тот же для второй части кода, в которой вы используете Matcher

другое решение, основанное на ответе, который вы отправили, с использованием переходных вы должны объявить Matcher из метода для того, чтобы использовать transient я не уверен в контексте вашего кода или, если вы можете объявить Matcher и использовать его в дальнейшем, например:

transient Matcher matcher = null; 

def commits = sh script: """ git log ${previous_tag}..HEAD --oneline --decorate""", returnStdout: true 
def array = commits.split("\\n"); 

ArrayList<String> mystats = new ArrayList<>(array.length); 
for(int i =0; i < array.length; i++) { 
    Pattern pattern = Pattern.compile("^\\w{7}\\s(MYSTATS-|mystats-)"); 
    matcher = pattern.matcher(array[i]); 
    if(matcher.find()) { 
     mystats.add(array[i]) 
    } 
} 

и то же самое для второй части кода, если они не находятся в том же классе (охват), то нет необходимости переобъявить Matcher

+0

Спасибо, что нашли время, чтобы опубликовать это, похоже, я не могу «переходный Matcher matcher = null;», а затем использовать матчи позже в той же области – Richlewis

+0

@ Richlewis, это странно! Я пробовал это на Java, и он отлично работает, вы можете его повторно использовать ... любыми способами в отношении аннотации? – Yazan

+0

им просто пробовал это сейчас, но нужно прочитать несколько вещей, во-первых, не используя возврат в публичной функции пустоты – Richlewis

Смежные вопросы