Создание файла банки из файла Scala

zip () ваш разбитый (на '/') текст сам сместился на 1 и сложил его, используя правильные промежуточные значения:

x = "abc/xyz/abc/xyz/ab_c : abc/xyz/abc/xyz/ab_c,ab_c/xy_z/ab_c/xy_z/ab_c/xy_z,1"

parts = x.split("/")
pp = zip(parts,parts[1:])

l = []
for at,after in pp:
    if ',' in after:
        l.extend([at,'/'])
    else:
        l.extend([at,'_'])
l.append(after)  

# join and add spaces after ,
new_t = ''.join(l).replace(",",", ")
print(new_t) 
print('abc_xyz_abc_xyz_ab_c : abc_xyz_abc_xyz/ab_c, ab_c_xy_z_ab_c_xy_z_ab_c/xy_z, 1')

Вывод: [ 116]

abc_xyz_abc_xyz_ab_c : abc_xyz_abc_xyz/ab_c, ab_c_xy_z_ab_c_xy_z_ab_c/xy_z, 1
abc_xyz_abc_xyz_ab_c : abc_xyz_abc_xyz/ab_c, ab_c_xy_z_ab_c_xy_z_ab_c/xy_z, 1

Застегнутая вещь выглядит следующим образом:

# pp splitted zipped with itself, shifted by 1
[('abc', 'xyz'), ('xyz', 'abc'), ('abc', 'xyz'), ('xyz', 'ab_c : abc'), 
 ('ab_c : abc', 'xyz'), ('xyz', 'abc'), ('abc', 'xyz'), ('xyz', 'ab_c,ab_c'),
 ('ab_c,ab_c', 'xy_z'), ('xy_z', 'ab_c'), ('ab_c', 'xy_z'), ('xy_z', 'ab_c'),
 ('ab_c', 'xy_z,1')]

Этот код использует печать в стиле Python 3 - но он также работает в Python 2

49
задан Peter Mortensen 15 November 2009 в 08:09
поделиться

5 ответов

Пример структуры каталогов:

X:\scala\bin
X:\scala\build.bat
X:\scala\MANIFEST.MF
X:\scala\src
X:\scala\src\foo
X:\scala\src\foo\HelloWorld.scala

HelloWorld.scala:

//file: foo/HelloWorld.scala
package foo {
  object HelloWorld {
    def main(args: Array[String]) {
      println("Hello, world!")
    }
  }
}

MANIFEST.MF:

Main-Class: foo.HelloWorld
Class-Path: scala-library.jar

build.bat:

@ECHO OFF

IF EXIST hellow.jar DEL hellow.jar
IF NOT EXIST scala-library.jar COPY %SCALA_HOME%\lib\scala-library.jar .

CALL scalac -sourcepath src -d bin src\foo\HelloWorld.scala

CD bin
jar -cfm ..\hellow.jar ..\MANIFEST.MF *.*
CD ..

java -jar hellow.jar

Для успешного использования -jar , вам нужно две записи в файле META-INF / MANIFEST.MF : основной класс; относительные URL-адреса для любых зависимостей. Примечания к документации:

-jar

Выполнить программу, инкапсулированную в JAR-файл. Первый аргумент имя файла JAR вместо имя класса запуска. Для этого возможность работать, манифест JAR-файл должен содержать строку Форма Main-Class: имя класса. Вот, имя класса идентифицирует класс, имеющий общедоступная статическая пустота main (String [] args) метод, который служит вашим отправная точка приложения. Увидеть Справочная страница инструмента Jar и банка след Java-учебник для информация о работе с Jar файлы и Jar-файлы манифестов.

Когда вы используете эту опцию, файл JAR является источником всех пользовательских классов, и другие настройки пути к классам пользователей игнорируются.

(Примечания: файлы JAR можно проверять в большинстве приложений ZIP; я, вероятно, пренебрегаю обработкой пробелов в именах каталогов в пакетный скрипт; Scala-код бегуна, версия 2.7.4.final.)


Для полноты, эквивалентный bash-скрипт:

#!/bin/bash

if [ ! $SCALA_HOME ]
then
    echo ERROR: set a SCALA_HOME environment variable
    exit
fi

if [ ! -f scala-library.jar ]
then
    cp $SCALA_HOME/lib/scala-library.jar .
fi

scalac -sourcepath src -d bin src/foo/HelloWorld.scala

cd bin
jar -cfm ../hellow.jar ../MANIFEST.MF *
cd ..

java -jar hellow.jar
54
ответ дан 7 November 2019 в 11:45
поделиться

Поскольку сценарии Scala требуют установки библиотек Scala, вам придется включить среду выполнения Scala вместе с вашим JAR.

Для этого существует множество стратегий, например jar jar , но в конечном итоге проблема, с которой вы столкнулись, заключается в том, что запущенный Java-процесс не может найти JAR-файлы Scala.

Для простого автономного скрипта я бы рекомендовал использовать jar jar, в противном случае вам следует начать искать инструмент управления зависимостями или потребовать, чтобы пользователи установили Scala в JDK .

10
ответ дан 7 November 2019 в 11:45
поделиться

Вы также можете использовать maven и maven-scala-plugin. После того, как вы настроили maven, вы можете просто создать пакет mvn, и он создаст для вас вашу банку.

4
ответ дан 7 November 2019 в 11:45
поделиться

Я модифицировал bash-скрипт, добавив некоторые интеллектуальные возможности, включая автоматическую генерацию манифеста.

Этот скрипт предполагает, что главный объект называется так же, как и файл, в котором он находится (с учетом регистра). Кроме того, либо имя текущего каталога должно быть равно имени основного объекта, либо имя основного объекта должно быть указано в качестве параметра командной строки. Запустите этот скрипт из корневого каталога вашего проекта. Измените переменные в верхней части по мере необходимости.

Имейте в виду, что скрипт создаст папки bin и dist и ERASE любое существующее содержимое в bin.


#!/bin/bash

SC_DIST_PATH=dist
SC_SRC_PATH=src
SC_BIN_PATH=bin
SC_INCLUDE_LIB_JAR=scala-library.jar
SC_MANIFEST_PATH=MANIFEST.MF
SC_STARTING_PATH=$(pwd)

if [[ ! $SCALA_HOME ]] ; then
    echo "ERROR: set a SCALA_HOME environment variable"
    exit 1
fi

if [[ ! -f $SCALA_HOME/lib/$SC_INCLUDE_LIB_JAR ]] ; then
    echo "ERROR: Cannot find Scala Libraries!"
    exit 1
fi

if [[ -z "$1" ]] ; then
    SC_APP=$(basename $SC_STARTING_PATH)
else
    SC_APP=$1
fi

[[ ! -d $SC_DIST_PATH ]] && mkdir $SC_DIST_PATH

if [[ ! -d $SC_BIN_PATH ]] ; then
    mkdir "$SC_BIN_PATH"
else
    rm -r "$SC_BIN_PATH"
    if [[ -d $SC_BIN_PATH ]] ; then
        echo "ERROR:  Cannot remove temp compile directory:  $SC_BIN_PATH"
        exit 1
    fi
    mkdir "$SC_BIN_PATH"
fi

if [[ ! -d $SC_SRC_PATH ]] || [[ ! -d $SC_DIST_PATH ]] || [[ ! -d $SC_BIN_PATH ]] ; then
    echo "ERROR: Directory not found!:  $SC_SRC_PATH or $SC_DIST_PATH or $SC_BIN_PATH"
    exit 1
fi

if [[ ! -f $SC_DIST_PATH/$SC_INCLUDE_LIB_JAR ]] ; then
    cp "$SCALA_HOME/lib/$SC_INCLUDE_LIB_JAR" "$SC_DIST_PATH"
fi

SCALA_MAIN=$(find ./$SC_SRC_PATH -name "$SC_APP.scala")
COMPILE_STATUS=$?
SCALA_MAIN_COUNT=$(echo "$SCALA_MAIN" | wc -l)

if [[ $SCALA_MAIN_COUNT != "1" ]] || [[ ! $COMPILE_STATUS == 0 ]] ; then
    echo "Main source file not found or too many exist!:  $SC_APP.scala"
    exit 1
fi

if [[ -f $SC_DIST_PATH/$SC_APP.jar ]] ; then
    rm "$SC_DIST_PATH/$SC_APP.jar"  
    if [[ -f $SC_DIST_PATH/$SC_APP.jar ]] ; then
        echo "Unable to remove existing distribution!:  $SC_DIST_PATH/$SC_APP.jar"
        exit 1
    fi
fi

if [[ ! -f $SC_MANIFEST_PATH ]] ; then
    LEN_BASE=$(echo $(( $(echo "./$SC_SRC_PATH" |wc -c) - 0 )))
    SC_MAIN_CLASS=$(echo $SCALA_MAIN |cut --complement -c1-$LEN_BASE)
    SC_MAIN_CLASS=${SC_MAIN_CLASS%%.*}
    SC_MAIN_CLASS=$(echo $SC_MAIN_CLASS |awk '{gsub( "/", "'"."'"); print}')

    echo $(echo "Main-Class: "$SC_MAIN_CLASS) > $SC_MANIFEST_PATH
    echo $(echo "Class-Path: "$SC_INCLUDE_LIB_JAR) >> $SC_MANIFEST_PATH
fi

scalac -sourcepath $SC_SRC_PATH -d $SC_BIN_PATH $SCALA_MAIN
COMPILE_STATUS=$?

if [[ $COMPILE_STATUS != "0" ]] ; then
    echo "Compile Failed!"
    exit 1
fi

cd "$SC_BIN_PATH"
jar -cfm ../$SC_DIST_PATH/$SC_APP.jar ../$SC_MANIFEST_PATH *
COMPILE_STATUS=$?
cd "$SC_STARTING_PATH"

if  [[ $COMPILE_STATUS != "0" ]] || [[ ! -f $SC_DIST_PATH/$SC_APP.jar ]] ; then
    echo "JAR Build Failed!"
    exit 1
fi

echo " "
echo "BUILD COMPLETE!... TO LAUNCH:  java -jar $SC_DIST_PATH/$SC_APP.jar"
echo " "
2
ответ дан 7 November 2019 в 11:45
поделиться

Одна вещь, которая может вызвать аналогичную проблему (хотя это не проблема в начальном вопросе выше), заключается в том, что виртуальная машина Java, похоже, требует, чтобы основной метод возвращал void . В Scala мы можем написать что-то вроде ( обратите внимание на знак = в определении main ):

object MainProgram {

  def main(args: Array[String]) = {
    new GUI(args)
  }
}

где main фактически возвращает объект GUI (т.е. это не void ), но программа будет нормально работать, если мы запустим ее с помощью команды scala.

Если мы упакуем этот код в jar-файл с MainProgram в качестве главного класса, виртуальная машина Java будет жаловаться на отсутствие функции main, поскольку тип возврата нашей основной программы не ] void (я нахожу эту жалобу несколько странной, поскольку тип возвращаемого значения не является частью подписи).

У нас не было бы проблем, если бы мы не указали знак = в заголовке main или если бы мы явно объявили его как Unit .

2
ответ дан 7 November 2019 в 11:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: