Введение 4
1. Обзор предметной области 7
1.1. Открытое программное обеспечение 7
1.2. Лицензии программного обеспечения 7
1.3. Совместимость типов лицензий 11
1.4. Совместимость открытых лицензий 12
1.5. Исследования нарушений лицензирования ПО 13
2. Обзор существующих решений 15
3. Архитектура плагина 18
4. Алгоритм контроля лицензий 20
4.1. Извлечение информации о лицензиях компонент проекта 21
4.2. Определение допустимых лицензий для модуля проекта 27
5. Пользовательской интерфейс плагина 32
6. Апробация плагина 36
Заключение 39
Список литературы 42
На сегодняшний день существует большое количество проектов с открытым исходным кодом (open source projects). В 2018 году в открытом доступе на хостинге IT-проектов GitHub существовало более 180 000 открытых проектов [22], и их количество продолжает расти.
Открытые лицензии программного обеспечения позволяют разработчикам надлежащим образом использовать, модифицировать и распространять программное обеспечение. За нарушение условий лицензии предусмотрена ответственность, включающая крупные денежные штрафы. Лицензирование открытого программного обеспечения — сложная область со множеством нюансов. На данный момент насчитывается более 450 различных открытых лицензий [27].
Обычно программисты склонны повторно использовать любой находящийся в открытом доступе код, не обращая внимания на его лицензию. В крупных IT-компаниях вопросом лицензирования занимаются специальные юристы, которые проверяют лицензии открытого ПО, использующееся в продуктах компании, и выявляют возможные несовместимости. Вместе с тем, у обычных разработчиков часто не хватает ресурсов для таких пристальных проверок.
Согласно результатам исследования фон Крога и др. [42] существуют две основные причины нарушения лицензий программного обеспечения с открытым исходным кодом. Первая причина заключается в том, что из-за ограничения в ресурсах и времени разработчики часто повторно используют сторонний код, чтобы не тратить силы на решение тривиальных задач. Вторая причина заключается в том, что из-за большого количества открытых лицензий разработчики программного обеспечения часто не понимают их условия и различия между ними, что впоследствии может приводить к нарушениям лицензирования [9].
Для того, чтобы изучить текущую ситуацию с заимствованием кода и нарушением лицензий, лаборатория Методов машинного обучения в программной инженерии JetBrains Research провела исследование потенциальных нарушений лицензирования в популярных Java-проектах на GitHub [29]. В рамках исследования было изучено и описано значительное количество открытых лицензий, а также сложная система их совместимости. По результатам исследования оказалось, что целых 9,4% методов Java-классов в данных проектах потенциально могли быть скопированы с нарушением лицензирования.
Чтобы помочь разработчикам не совершать подобных ошибок и не тратить время на отдельные проверки, можно показывать по запросу необходимую информацию прямо в интегрированной среде разработки (Integrated Development Environment, IDE). Такая возможность позволит определять совместимые лицензии проекта и сообщать программисту о потенциальных нарушениях. Благодаря этому разработчики смогут избегать ошибок, связанных с лицензиями, что потенциально снизит количество нарушений лицензирования в открытых программных продуктах.
Постановка задачи
Целью данной выпускной квалификационной работы является разработка плагина к IntelliJ IDEA для работы с лицензиями Java-проектов. Плагин должен позволить на основании лицензий компонент проекта определять допустимые лицензии для каждого модуля проекта и сообщать программисту о потенциальных нарушениях.
Для достижения цели были поставлены следующие задачи.
• Сделать обзор предметной области.
• Провести анализ существующих решений в этой области.
• Разработать архитектуру плагина.
• Реализовать алгоритм контроля лицензий проекта:
— реализовать процедуру извлечения информации о лицензиях компонент проекта;
— реализовать механизм определения допустимых лицензий для модуля проекта на основании лицензий компонент проекта.
• Реализовать пользовательский интерфейс плагина.
• Провести апробацию созданного инструмента.
В ходе данной работы были получены следующие результаты.
1. Сделан обзор предметной области. Рассмотрены различные типы открытых лицензий и правила совместимости между ними. Также сделан обзор известных исследований о нарушении лицензирования при копировании кода открытых проектов.
2. Проведен анализ популярных инструментов для работы с лицензиями проектов, который показал, что большинство инструментов не обрабатывают лицензии зависимостей проекта. Бесплатные инструменты не предоставляют пользователю рекомендации по выбору основной лицензии проекта и не сообщают о несовместимых лицензиях. Кроме того, ни один из инструментов не встроен ни в одну из популярных интегрированных сред разработки.
3. Спроектирована архитектура плагина. Она позволила отделить логику работы с лицензиями от пользовательского интерфейса и упростить поддержку новых детекторов и лицензий в плагине.
4. Реализован алгоритм контроля лицензий проекта. Реализован механизм извлечения информации о лицензиях модулей и зависимостей проекта, а также реализован механизм определения совместимых лицензий для каждого модуля проекта на основании лицензий зависимостей и подмодулей.
5. Реализован интерфейс плагина, который содержит подробную информацию о лицензиях модулей и зависимостей, а также список потенциальных нарушений лицензирования. Кроме того, интерфейс содержит рекомендации по выбору лицензии, совместимой с лицензиями всех модулей и зависимостей проекта.
6. Проведена апробация разработанного плагина на 100 самых популярных проектах на GitHub, содержащих код на Java. Плагин обнаружил 762 потенциальных нарушений лицензирования, из которых 384 потенциальное нарушение связано с использованием библиотек с модификациями лицензии GPL-2.0 в модулях с раз-решительной лицензией.
В результате данной работы была реализована и выпущена пилот-ная версия плагина для работы с лицензиями Java-проектов, который может успешно применяться для поиска потенциальных нарушений лицензирования. Плагин может быть улучшен главным образом за счет расширения списка поддерживаемых лицензий и более точных инструментов для определения типа лицензии по её полному тексту. Весь код проекта находится в открытом доступе на GitHub.
Благодарности
Я хочу поблагодарить Ярослава Голубева за всестороннюю поддержку в процессе работы над плагином, а также за помощь с коррекцией текста и ценные замечания по простоте восприятия работы.
Также я хочу поблагодарить Владислава Танкова за помощь в решении проблем, связанных с технической частью этой работы.
Отдельное спасибо Ивану Кузнецову, который разработал модель машинного обучения для определения лицензии по тексту и помогал с интеграцией модели в плагин.
Кроме того, я выражаю свою благодарность Егору Булычеву за то, что согласился отрецензировать эту работу и дал ценные замечания.
И, конечно же, я хочу поблагодарить своего научного руководителя, Тимофея Брыксина, который качественно и трудолюбиво оказывает помощь своим студентам в написании выпускных квалификационных работ.
[1] The 3-Clause BSD License. — 1999. — Режим доступа: https://opensource.org/licenses/BSD-3-Clause (дата обращения: 29.11.2020).
[2] Aladdin Free Public License. — 2000. — Режим доступа: https://www.tug.org/fonts/getnonfreefonts/AFPL.html (дата обращения: 29.11.2020).
[3] Apache License, Version 2.0. — 2004. — Режим доступа: https://opensource.org/licenses/Apache-2.0 (дата обращения: 29.11.2020).
[4] Balter Ben. Open source license usage on GitHub.com. —
2015. — Режим доступа: https://github.blog/
2015-03-09-open-source-license-usage-on-github-com/ (дата обращения: 29.11.2020).
[5] Bintray JCenter dependency repository. — 2021. — Режим доступа: https://bintray.com/bintray/jcenter (дата обращения: 29.03.2020).
[6] Brasseur V.M. Forge Your Future with Open Source: Build Your Skills, Build Your Network, Build the Future of Technology. Pragmatic pro-grammers.— Pragmatic Bookshelf, 2018. — ISBN:9781680503012.— Access mode: https://books.google.ru/books?id=ley-tAEACAAJ.
[7] CatBoost — gradient boosting on decision trees. — 2021. — Режим доступа: https://catboost.ai/ (дата обращения: 29.03.2020).
[8] Dice Lee R. Measures of the Amount of Ecologic Association Between Species //Ecology. — 1945.—Vol. 26, no. 3. — P. 297-302.— https://esajournals.onlinelibrary.wiley.com/doi/pdf/10.2307/1932409.
[9] Do Software Developers Understand Open Source Licenses? / Daniel A. Almeida, Gail C. Murphy, Greg Wilson, Mike Hoye // Pro¬ceedings of the 25th International Conference on Program Comprehen¬sion.— ICPC ’17. — Buenos Aires, Argentina : IEEE Press, 2017.— P. 1-11.—Access mode: https://doi.Org/10.1109/ICPC.2017.7.
[10] An Empirical Study of License Violations in Open Source Projects / Arunesh Mathur, Harshal Choudhary, Priyank Vashist et al. // Pro-ceedings of the 2012 35th Annual IEEE Software Engineering Work-shop.— SEW ’12. — USA : IEEE Computer Society, 2012. — P. 168¬176. — Access mode: https://doi.org/10.1109/SEW.2012.24.
[11] FOSSA official website. — 2020.—Режим доступа: https://fossa.com(дата обращения: 29.11.2020).
[12] FOSSology GitHub repository. — 2008. — Режим доступа: https://github.com/fossology/fossology (дата обращения: 29.11.2020).
[13] The GNU licenses. — Режим доступа: https://www.gnu.org/licenses/ (дата обращения: 29.11.2020).
[14] Gaudeul Alex. Do Open Source Developers Respond to Competition? The LATEX Case Study //Review of Network Economics. —01 Jun. 2007. — Vol. 6, no. 2. — Access mode: https://www.degruyter.com/view/journals/rne/6/2/article-rne.2007.6.2.1119.xml.xml.
[15] German Daniel M., Di Penta Massimiliano, Davies Julius.Under-standing and Auditing the Licensing of Open Source Software Distri-butions // Proceedings of the 2010 IEEE 18th International Confer¬ence on Program Comprehension. — ICPC ’10. — USA : IEEE Com¬puter Society, 2010. — P. 84-93. — Access mode: https://doi.org/10.1109/ICPC.2010.48.
[16] Gradle License Report GitHub repository. — 2020. — Режим доступа: https://github.com/jk1/Gradle-License-Report (дата обращения: 29.11.2020).
[17] Intellij Platform GitHub repository. — 2021. — Режим доступа: https://github.com/JetBrains/intellij-community(дата обращения: 29.03.2020).
[18] Intellij Platform SDK Docs. — 2021. — Режим доступа: https://plugins.jetbrains.com/docs/intellij/welcome.html (дата обращения: 29.03.2020).
[19] Java Research License. — 2020. — Режим доступа: https://www.oracle.com/technetwork/java/javase/jrl-5-150091.txt(дата обращения: 29.11.2020).
[20] KInference. — 2021. — Режим доступа: https://github.com/JetBrains-Research/kinference (дата обращения: 29.03.2020).
[21] The MIT License. — 1988. — Режим доступа: https://opensource.org/licenses/MIT(дата обращения: 29.11.2020).
[22] Markovtsev Vadim, Long Waren. Public git archive //Proceedingsof the 15th International Conference on Mining Software Repositories- MSR ’18.—2018. — Access mode: http://dx.doi.org/10.1145/3196398.3196464.
[23] Maven Central dependency repository. — 2021. — Режим доступа: https://mvnrepository.com/repos/central/ (дата обращения: 29.03.2020).
[24] Open Neural Network Exchange. — 2021.—Режим доступа: https://onnx.ai/ (дата обращения: 29.03.2020).
[25] The Open Source Definition. — 2007. — Режим доступа: https://opensource.org/osd(дата обращения: 29.11.2020).
[26] Package Search Official Website. — 2021.—Режим доступа: https://package-search.jetbrains.com/ (дата обращения: 29.03.2020).
[27] SPDX License List. — 2020.—Режим доступа: https://spdx.org/licenses/ (дата обращения: 29.11.2020).
[28] Sourcerer’s Apprentice and the study of code snippet migration / S. Romansky, C. Chen, B. Malhotra, A. Hindle // ArXiv. — 2018.—Vol. abs/1808.00106.
[29] A Study of Potential Code Borrowing and License Violations in Java Projects on GitHub / Yaroslav Golubev, Maria Eliseeva, Nikita Po¬varov, Timofey Bryksin // Proceedings of the 17th International Conference on Mining Software Repositories. — New York, NY, USA : Association for Computing Machinery, 2020. — P. 54-64. — ISBN:9781450375177. — Access mode: https://doi.org/10.1145/3379597.3387455.
[30] Sunset Bintray JCenter Official Blog Post. —
2021. — Режим доступа: https://jfrog.com/blog/
into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/(дата обращения: 29.03.2020).
[31] Swing — GUI widget toolkit for Java. — 2021. — Режим доступа: https://docs.oracle.com/javase/8/docs/technotes/guides/swing/index.html (дата обращения: 29.03.2020).
[32] Wikipedia contributors. Software license — Wikipedia, The Free En-cyclopedia.— 2020. — [Online; accessed 14-December-2020]. Access mode: https://en.wikipedia.org/w/index.php?title=Software_license&oldid=991148912.
[33] Zhang Hongyu, Shi Bei, Zhang Lu.Automatic Checking of LicenseCompliance // Proceedings of the 2010 IEEE International Conference on Software Maintenance. — ICSM ’10. — USA : IEEE Computer So¬ciety, 2010.—P. 1-3.—Access mode: https://doi.org/10.1109/ICSM.2010.5609557.
[34] askalono GitHub repository. -- 2018. -- Режим доступа: https://github.com/jpeddicord/askalono (дата обращения: 29.11.2020).
[35] go-license-detector GitHub repository. — 2018. — Режим доступа: https://github.com/src-d/go-license-detector (дата обращения: 29.11.2020).
[36] gradle-license-plugin GitHub repository. — 2020. — Режим доступа: https://github.com/jaredsburrows/gradle-license-plugin(да¬та обращения: 29.11.2020).
[37] license-maven-plugin GitHub repository. — 2013. — Режим доступа: https://github.com/mycila/license-maven-plugin(дата об-ращения: 29.11.2020).
[38] licensechecker GitHub repository. — 2018. — Режим доступа: https://github.com/boyter/lc (дата обращения: 29.11.2020).
[39] licensee GitHub repository. — 2014. — Режим доступа: https://
github.com/licensee/licensee (дата обращения: 29.11.2020).
[40] ootpa Troan Larry. Open Source from a Proprietary Perspective. — 2006. — Режим доступа: https://docplayer.net/5605674-Open-source-from-a-larry-ootpa-troan.html (дата обращения: 29.11.2020).
[41] scancode-toolkit GitHub repository. — 2015. — Режим доступа: https://github.com/nexB/scancode-toolkit (дата обращения: 29.11.2020).
[42] von Krogh G., Spaeth S., Haefliger S.Knowledge Reuse in Open SourceSoftware: An Exploratory Study of 15 Open Source Projects // Pro¬ceedings of the 38th Annual Hawaii International Conference on Sys¬tem Sciences. — 2005.—P. 198b-198b.